[APPC-44] APPC Lifecycle Management refactor

Pull APPC lifecycle Management out of APPC dispatcher, so that it can be
used by both APPC dispatcher and APPC OAM. This is the pre-step of
introducing APPC OAM operations.

Issue-Id: APPC-44
Change-Id: Icbde399b5121fae9e1919cfdd5c77bbe55d61188
Signed-off-by: beili.zhou <beili.zhou@amdocs.com>
diff --git a/appc-lifecycle-management/.gitignore b/appc-lifecycle-management/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/appc-lifecycle-management/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/.gitignore b/appc-lifecycle-management/appc-lifecycle-management-api/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-lifecycle-management/appc-lifecycle-management-api/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/pom.xml b/appc-lifecycle-management/appc-lifecycle-management-api/pom.xml
new file mode 100644
index 0000000..ffd8669
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.openecomp.appc</groupId>
+        <artifactId>appc-lifecycle-management</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>appc-lifecycle-management-api</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>appc-lifecycle-management-api</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Export-Package>org.openecomp.appc.lifecyclemanager.*</Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java
new file mode 100644
index 0000000..352bf4b
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/LifecycleManager.java
@@ -0,0 +1,33 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager;

+

+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;

+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;

+

+public interface LifecycleManager {

+    String getNextState(String vnfType, String currentState, String event)

+            throws NoTransitionDefinedException,LifecycleException;

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java
new file mode 100644
index 0000000..13b2173
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LCMResponse.java
@@ -0,0 +1,36 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager.objects;

+

+public enum LCMResponse {

+    INVALID_INPUT_PARAMETERS,

+    NO_STATE_CHANGE,

+    NO_TRANSITION_DEFINED,

+    VALID_TRANSITION;

+

+    public String toString(){

+        return this.name();

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java
new file mode 100644
index 0000000..5d66900
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/LifecycleException.java
@@ -0,0 +1,36 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager.objects;

+

+public class LifecycleException extends Exception {

+    public final String currentState;

+    public final String event;

+

+    public LifecycleException(Exception e,String currentState,String event){

+        super(e);

+        this.currentState = currentState;

+        this.event = event;

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java
new file mode 100644
index 0000000..f6670eb
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/NoTransitionDefinedException.java
@@ -0,0 +1,36 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager.objects;

+

+public class NoTransitionDefinedException extends Exception {

+    public final String currentState;

+    public final String event;

+

+    public NoTransitionDefinedException(String message,String currentState,String event){

+        super(message);

+        this.currentState = currentState;

+        this.event = event;

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java
new file mode 100644
index 0000000..8d92e35
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-api/src/main/java/org/openecomp/appc/lifecyclemanager/objects/VNFOperationOutcome.java
@@ -0,0 +1,32 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager.objects;

+

+public enum VNFOperationOutcome {

+    SUCCESS,FAILURE,EXPIRE;

+    public String toString(){

+        return this.name();

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/.gitignore b/appc-lifecycle-management/appc-lifecycle-management-core/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/pom.xml b/appc-lifecycle-management/appc-lifecycle-management-core/pom.xml
new file mode 100644
index 0000000..f7e9115
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/pom.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!--
+
+        Licensed to the Apache Software Foundation (ASF) under one or more
+        contributor license agreements.  See the NOTICE file distributed with
+        this work for additional information regarding copyright ownership.
+        The ASF licenses this file to You under the Apache License, Version 2.0
+        (the "License"); you may not use this file except in compliance with
+        the License.  You may obtain a copy of the License at
+
+            http://www.apache.org/licenses/LICENSE-2.0
+
+        Unless required by applicable law or agreed to in writing, software
+        distributed under the License is distributed on an "AS IS" BASIS,
+        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+        See the License for the specific language governing permissions and
+        limitations under the License.
+    -->
+
+    <parent>
+        <groupId>org.openecomp.appc</groupId>
+        <artifactId>appc-lifecycle-management</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>appc-lifecycle-management-core</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>appc-lifecycle-management-core Bundle</name>
+    <description>appc-lifecycle-management-core OSGi bundle project.</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-lifecycle-management-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>state-machine-lib</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.att.eelf</groupId>
+            <artifactId>eelf-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Embed-Transitive>true</Embed-Transitive>
+                        <Export-Service>org.openecomp.appc.lifecyclemanager.LifecycleManager</Export-Service>
+                        <Import-Package>
+                            org.openecomp.appc.lifecyclemanager.*,
+                            *;resolution:=optional
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
new file mode 100644
index 0000000..890218e
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/java/org/openecomp/appc/lifecyclemanager/impl/LifecycleManagerImpl.java
@@ -0,0 +1,102 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.lifecyclemanager.impl;

+

+import com.att.eelf.configuration.EELFLogger;

+import com.att.eelf.configuration.EELFManager;

+import com.att.eelf.i18n.EELFResourceManager;

+import org.openecomp.appc.exceptions.InvalidInputException;

+import org.openecomp.appc.i18n.Msg;

+import org.openecomp.appc.lifecyclemanager.LifecycleManager;

+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;

+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;

+import org.openecomp.appc.statemachine.StateMachine;

+import org.openecomp.appc.statemachine.StateMetaDataReader;

+import org.openecomp.appc.statemachine.impl.StateMachineFactory;

+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;

+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;

+import org.openecomp.appc.statemachine.objects.*;

+

+import java.util.Map;

+import java.util.concurrent.ConcurrentHashMap;

+

+public class LifecycleManagerImpl implements LifecycleManager{

+

+    private StateMetaDataReader metadataReader;

+    private static Map<String,StateMachine> stateMachineMap = new ConcurrentHashMap<>();

+    private final EELFLogger logger = EELFManager.getInstance().getLogger(LifecycleManagerImpl.class);

+    private final EELFLogger errorLogger = EELFManager.getInstance().getErrorLogger();

+

+    @Override

+    public String getNextState(String vnfType, String currentState, String event) throws NoTransitionDefinedException,LifecycleException{

+        if (logger.isTraceEnabled()) {

+            logger.trace("Entering to getNextState with vnfType = "+ vnfType +    ", currentState = " + currentState + ", event = " + event);

+        }

+

+        State nextState;

+        StateMachine machine;

+        StateMachineResponse response;

+        try {

+            machine = this.getStateMachine(vnfType);

+            response = machine.handleEvent(new State(currentState),new Event(event));

+            if(Response.NO_TRANSITION_DEFINED.equals(response.getResponse())){

+                errorLogger.error(EELFResourceManager.format(Msg.VF_ILLEGAL_COMMAND, vnfType,event,currentState));

+                throw new NoTransitionDefinedException("No Transition Defined for currentState = " +  currentState + ", event = " + event,currentState,event);

+            }

+            nextState = response.getNextState();

+        } catch (InvalidInputException e) {

+            logger.error(e.getMessage());

+            throw new LifecycleException(e,currentState,event);

+        }

+        if (logger.isTraceEnabled()) {

+            logger.trace("Exiting from getNextState with (nextState = " + nextState.getStateName() + ")");

+        }

+        return nextState.getStateName();

+    }

+

+    private StateMachine getStateMachine(String vnfType){

+        if (logger.isTraceEnabled()) {

+            logger.trace("Entering to getNextState with vnfType = "+ vnfType);

+        }

+        if(vnfType == null){

+            vnfType = "DEFAULT";

+        }

+        StateMachine machine = stateMachineMap.get(vnfType);

+        if(machine == null){

+            metadataReader = getMetadataReader(vnfType);

+            StateMachineMetadata metadata = metadataReader.readMetadata();

+            machine = StateMachineFactory.getStateMachine(metadata);

+            stateMachineMap.put(vnfType,machine);

+        }

+

+        logger.trace("Exiting getStateMachine with StateMachine = " + stateMachineMap.get(vnfType).toString());

+        return stateMachineMap.get(vnfType);

+    }

+

+    private StateMetaDataReader getMetadataReader(String vnfType) {

+        return vnfType.equals("APPC") ? new AppcOamMetaDataReader() : new VnfMetaDataReader();

+    }

+

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..77725db
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+  ============LICENSE_START=======================================================
+  ONAP : APPC
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Copyright (C) 2017 Amdocs

+  =============================================================================

+  Licensed under the Apache License, Version 2.0 (the "License");

+  you may not use this file except in compliance with the License.

+  You may obtain a copy of the License at

+  

+       http://www.apache.org/licenses/LICENSE-2.0

+  

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+  

+  ECOMP is a trademark and service mark of AT&T Intellectual Property.
+  ============LICENSE_END=========================================================

+  -->

+

+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"

+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

+    <bean id="lifecycleManagerBean" class="org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl" scope="singleton">

+    </bean>

+

+    <service id="lcmService" interface="org.openecomp.appc.lifecyclemanager.LifecycleManager" ref="lifecycleManagerBean"/>

+

+</blueprint>

diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties
new file mode 100644
index 0000000..6b634ca
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/main/resources/org/openecomp/appc/default.properties
@@ -0,0 +1,39 @@
+###

+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs

+# =============================================================================

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+# 

+#      http://www.apache.org/licenses/LICENSE-2.0

+# 

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+# 

+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# ============LICENSE_END=========================================================

+###

+

+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 

+# to supply configuration options 

+org.openecomp.appc.bootstrap.file=appc.properties

+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.

+

+#Property below provided by appc.properties

+appc.LCM.provider.url=https://localhost:8443/restconf/operations/appc-provider-lcm

+appc.LCM.poolMembers=<DMAAP_IP>:3904

+appc.LCM.service=dmaap

+appc.LCM.topic.write=APPC-TEST2

+appc.LCM.client.name=APPC-TEST-CLIENT-LC-MGMT-MAIN

+appc.LCM.provider.user=test

+appc.LCM.provider.pass=test

+

+

diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java
new file mode 100644
index 0000000..e58dcc9
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/LifecycleManagerTest.java
@@ -0,0 +1,185 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc;

+

+import org.junit.Assert;

+import org.junit.Test;

+import org.openecomp.appc.exceptions.InvalidInputException;

+import org.openecomp.appc.lifecyclemanager.LifecycleManager;

+import org.openecomp.appc.statemachine.StateMetaDataReader;

+import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;

+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;

+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;

+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader;

+import org.openecomp.appc.statemachine.impl.readers.VnfMetaDataReader.VNFOperation;

+import org.openecomp.appc.statemachine.objects.Event;

+import org.openecomp.appc.statemachine.objects.State;

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+import org.openecomp.appc.statemachine.objects.Transition;

+

+import java.util.*;

+

+

+public class LifecycleManagerTest {

+

+    private static final State[] VALID_LOCK_STATES = new State[] {

+            new State("instantiated"),

+            new State("configured"),

+            new State("tested"),

+            new State("running"),

+            new State("error"),

+            new State("unknown"),

+            new State("created"),

+            new State("not orchestrated"),

+            new State("stopped"),

+    };

+

+    @Test

+    public void handleEvent() throws InvalidInputException, LifecycleException, NoTransitionDefinedException {

+

+        StateMachineMetadata metadata = getMetaDataReader().readMetadata();

+        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();

+

+        /*

+         * Testing Positive Scenario passing the valid events and validating the StateMachineResponse

+         */

+        for(State state:metadata.getStates()){

+

+            for(Transition transition:state.getTransitions()){

+                Event event = transition.getEvent();

+                State nextStateFromMetadata = transition.getNextState();

+

+                String expectedNextState = lifecycleManager.getNextState(null,state.toString(),event.toString());

+                Assert.assertEquals(expectedNextState,nextStateFromMetadata.toString());

+            }

+        }

+

+        /*

+        Testing Negative Scenarios, 1. Passing the valid Events for which Transition is not defined in

+        Metadata and validating the StateMachineResponse 2. Passing the invalid events which are not

+        registered as events in the StateMachineMetadata and validating StateMachineResponse

+         */

+        for(State state:metadata.getStates()){

+

+            for(Transition transition:state.getTransitions()){

+                List<Event> negativeEvents = getNegativeEvents(state,metadata.getEvents());

+

+                for(Event negativeEvent:negativeEvents){

+                    boolean flag =false;

+                    try{

+                        lifecycleManager.getNextState(null,state.toString(),negativeEvent.toString());

+

+                    }

+                    catch (NoTransitionDefinedException e){

+                        flag =true;

+                    }

+                    Assert.assertEquals(flag,true);

+

+                    flag = false;

+                    try{

+                        lifecycleManager.getNextState(null,state.toString(),"PUT");

+                    }

+                    catch(LifecycleException e){

+                        flag = true;

+                    }

+                    Assert.assertTrue(flag);

+

+                }

+            }

+        }

+    }

+

+    @Test

+    public void testNotOrchestratedState() throws LifecycleException, NoTransitionDefinedException {

+        LifecycleManager lifecycleManager = new LifecycleManagerImpl();

+        String nextState = lifecycleManager.getNextState(

+                null,"NOT ORCHESTRATED",VNFOperation.Configure.toString());

+        Assert.assertEquals(nextState,"Configuring");

+    }

+

+    @Test(expected = NoTransitionDefinedException.class)

+    public void testBakckingUpState() throws LifecycleException, NoTransitionDefinedException {

+        LifecycleManager lifecycleManager = new LifecycleManagerImpl();

+        lifecycleManager.getNextState(null,"Software_Uploading",VNFOperation.Configure.toString());

+    }

+

+    private List<Event> getNegativeEvents(State state,Set<Event> events) {

+        List<Event> negativeEventList = new ArrayList<>();

+        negativeEventList.addAll(events);

+

+        for(Transition transition: state.getTransitions()){

+            negativeEventList.remove(transition.getEvent());

+        }

+        return negativeEventList;

+    }

+

+    @Test

+    public void testLockStates() throws LifecycleException, NoTransitionDefinedException {

+        StateMachineMetadata metadata = getMetaDataReader().readMetadata();

+        LifecycleManagerImpl lifecycleManager = new LifecycleManagerImpl();

+

+        for(State state: metadata.getStates()) {

+            if(isValidState(state, VALID_LOCK_STATES)) {

+                assertSameNextState(lifecycleManager, state, VNFOperation.Lock);

+                assertSameNextState(lifecycleManager, state, VnfMetaDataReader.VNFOperation.Unlock);

+                assertSameNextState(lifecycleManager, state, VNFOperation.CheckLock);

+            } else {

+                assertNoNextState(lifecycleManager, state, VNFOperation.Lock);

+                assertNoNextState(lifecycleManager, state, VNFOperation.Unlock);

+                assertNoNextState(lifecycleManager, state, VNFOperation.CheckLock);

+            }

+        }

+    }

+

+    private boolean isValidState(State state, State[] validStates) {

+        for(State validState: validStates) {

+            if(validState.equals(state)) {

+                return true;

+            }

+        }

+        return false;

+    }

+

+    private void assertSameNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)

+            throws LifecycleException, NoTransitionDefinedException {

+        Assert.assertEquals(state.getStateName(),

+                lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString()));

+    }

+

+    private void assertNoNextState(LifecycleManager lifecycleManager, State state, VNFOperation operation)

+            throws LifecycleException {

+        try {

+            lifecycleManager.getNextState("no-matter", state.getStateName(), operation.toString());

+            Assert.fail("lifecycleManager.getNextState() should fail for state [" + state

+                    + "], operation [" + operation + "]");

+        } catch(NoTransitionDefinedException e) {

+            // this exception is excepted

+        }

+    }

+

+    private StateMetaDataReader getMetaDataReader() {

+        return new VnfMetaDataReader();

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java
new file mode 100644
index 0000000..d3fe3ea
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-core/src/test/java/org/openecomp/appc/OamLifeCycleManagerTest.java
@@ -0,0 +1,152 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc;

+

+import org.junit.Assert;

+import org.junit.Before;

+import org.junit.Rule;

+import org.junit.Test;

+import org.junit.rules.ExpectedException;

+import org.openecomp.appc.lifecyclemanager.impl.LifecycleManagerImpl;

+import org.openecomp.appc.lifecyclemanager.objects.LifecycleException;

+import org.openecomp.appc.lifecyclemanager.objects.NoTransitionDefinedException;

+import org.openecomp.appc.statemachine.impl.readers.AppcOamMetaDataReader;

+import org.openecomp.appc.statemachine.impl.readers.AppcOamStates;

+

+import java.util.Arrays;

+import java.util.List;

+

+

+public class OamLifeCycleManagerTest {

+    private static final String VNF_TYPE_APPC = "APPC";

+    private static final String NO_DEFINITION_FORMAT = "No Transition Defined for currentState = %s, event = %s";

+

+    private LifecycleManagerImpl lifecycleManager;

+

+    @Rule

+    public ExpectedException expectedException = ExpectedException.none();

+

+    @Before

+    public void setUp() throws Exception {

+        lifecycleManager = new LifecycleManagerImpl();

+    }

+

+    private void validateProper(String state, String event, String expectedResult)

+            throws LifecycleException, NoTransitionDefinedException {

+        String nextState = lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);

+        Assert.assertEquals(String.format("Should return %s", expectedResult), expectedResult, nextState);

+    }

+

+    private void validateException(String state, String event) throws LifecycleException, NoTransitionDefinedException {

+        expectedException.expect(NoTransitionDefinedException.class);

+        expectedException.expectMessage(String.format(NO_DEFINITION_FORMAT, state, event));

+        lifecycleManager.getNextState(VNF_TYPE_APPC, state, event);

+

+        // Reset to no expectation

+        expectedException = ExpectedException.none();

+    }

+

+    @Test

+    public void testOamStateTransitionForMaintenanceMode() throws Exception {

+        String event = AppcOamMetaDataReader.AppcOperation.MaintenanceMode.name();

+        String expecteResult = AppcOamStates.EnteringMaintenanceMode.toString();

+

+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {

+            String state = appcOamStates.toString();

+            if (appcOamStates == AppcOamStates.Started) {

+                validateProper(state, event, expecteResult);

+            } else {

+                validateException(state, event);

+            }

+        }

+    }

+

+    @Test

+    public void testOamStateTransitionForStart() throws Exception {

+        String event = AppcOamMetaDataReader.AppcOperation.Start.name();

+        String expectResult = AppcOamStates.Starting.toString();

+

+        List<AppcOamStates> goodStates = Arrays.asList(

+                AppcOamStates.MaintenanceMode,

+                AppcOamStates.Stopped,

+                AppcOamStates.Stopping);

+

+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {

+            String state = appcOamStates.toString();

+            if (goodStates.contains(appcOamStates)) {

+                validateProper(state, event, expectResult);

+            } else {

+                validateException(state, event);

+            }

+        }

+    }

+

+    @Test

+    public void testOamStateTransitionForStop() throws Exception {

+        String event = AppcOamMetaDataReader.AppcOperation.Stop.name();

+        String expectResult = AppcOamStates.Stopping.toString();

+

+        List<AppcOamStates> goodStates = Arrays.asList(

+                AppcOamStates.Error,

+                AppcOamStates.EnteringMaintenanceMode,

+                AppcOamStates.MaintenanceMode,

+                AppcOamStates.Started,

+                AppcOamStates.Starting);

+

+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {

+            String state = appcOamStates.toString();

+            if (goodStates.contains(appcOamStates)) {

+                validateProper(state, event, expectResult);

+            } else {

+                validateException(state, event);

+            }

+        }

+    }

+

+

+    @Test

+    public void testOamStateTransitionForRestart() throws Exception {

+        String event = AppcOamMetaDataReader.AppcOperation.Restart.name();

+        String expectResult = AppcOamStates.Restarting.toString();

+

+        List<AppcOamStates> goodStates = Arrays.asList(

+                AppcOamStates.Error,

+                AppcOamStates.EnteringMaintenanceMode,

+                AppcOamStates.MaintenanceMode,

+                AppcOamStates.Started,

+                AppcOamStates.Starting,

+                AppcOamStates.Stopped,

+                AppcOamStates.Stopping);

+

+        for (AppcOamStates appcOamStates : AppcOamStates.values()) {

+            String state = appcOamStates.toString();

+            if (goodStates.contains(appcOamStates)) {

+                validateProper(state, event, expectResult);

+            } else {

+                validateException(state, event);

+            }

+        }

+    }

+}

diff --git a/appc-lifecycle-management/appc-lifecycle-management-features/.gitignore b/appc-lifecycle-management/appc-lifecycle-management-features/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-features/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/appc-lifecycle-management/appc-lifecycle-management-features/pom.xml b/appc-lifecycle-management/appc-lifecycle-management-features/pom.xml
new file mode 100644
index 0000000..c3ceedc
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-features/pom.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>appc-lifecycle-management</artifactId>
+    <groupId>org.openecomp.appc</groupId>
+    <version>1.1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <name>appc-lifecycle-management-features</name>
+  <artifactId>appc-lifecycle-management-features</artifactId>
+
+  <packaging>jar</packaging>
+
+  <dependencies>
+     <dependency>
+      <groupId>org.openecomp.appc</groupId>
+      <artifactId>appc-lifecycle-management-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
+     <dependency>
+      <groupId>org.openecomp.appc</groupId>
+      <artifactId>appc-lifecycle-management-core</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <resources>
+      <resource>
+        <filtering>true</filtering>
+        <directory>src/main/resources</directory>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>filter</id>
+            <goals>
+              <goal>resources</goal>
+            </goals>
+            <phase>generate-resources</phase>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-artifacts</id>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <phase>package</phase>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>${project.build.directory}/classes/${features.file}</file>
+                  <type>xml</type>
+                  <classifier>features</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      
+      <!-- Skipping ODL feature test -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <skipTests>true</skipTests>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml b/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml
new file mode 100644
index 0000000..9700f77
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-features/src/main/resources/features.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<!--

+  ============LICENSE_START=======================================================
+  ONAP : APPC
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Copyright (C) 2017 Amdocs

+  =============================================================================

+  Licensed under the Apache License, Version 2.0 (the "License");

+  you may not use this file except in compliance with the License.

+  You may obtain a copy of the License at

+  

+       http://www.apache.org/licenses/LICENSE-2.0

+  

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+  

+  ECOMP is a trademark and service mark of AT&T Intellectual Property.
+  ============LICENSE_END=========================================================

+  -->

+

+

+<features name="appc-lifecycle-management-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"

+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+    xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0  http://karaf.apache.org/xmlns/features/v1.2.0">

+

+    <feature name='appc-lifecycle-management' description="application executor" version='${project.version}'>

+        <bundle dependency="true">mvn:org.openecomp.appc/appc-common/${project.version}</bundle>

+        <bundle>mvn:org.openecomp.appc/state-machine-lib/${project.version}</bundle>

+        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-api/${project.version}</bundle>

+        <bundle>mvn:org.openecomp.appc/appc-lifecycle-management-core/${project.version}</bundle>

+    </feature>

+

+</features>

diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/.gitignore b/appc-lifecycle-management/appc-lifecycle-management-installer/.gitignore
new file mode 100644
index 0000000..731eb43
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/.gitignore
@@ -0,0 +1,2 @@
+/target/
+/.settings/
diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/pom.xml b/appc-lifecycle-management/appc-lifecycle-management-installer/pom.xml
new file mode 100644
index 0000000..f9d7045
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/pom.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.openecomp.appc</groupId>
+        <artifactId>appc-lifecycle-management</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>appc-lifecycle-management-installer</artifactId>
+    <name>APPC LifeCycle Management - Karaf Installer</name>
+    <packaging>pom</packaging>
+
+    <properties>
+        <application.name>appc-lifecycle-management</application.name>
+        <features.boot>appc-lifecycle-management</features.boot>
+        <features.repositories>
+            mvn:org.openecomp.appc/appc-lifecycle-management-features/${project.version}/xml/features
+        </features.repositories>
+        <include.transitive.dependencies>false</include.transitive.dependencies>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-lifecycle-management-features</artifactId>
+            <version>${project.version}</version>
+            <classifier>features</classifier>
+            <type>xml</type>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-lifecycle-management-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-lifecycle-management-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>maven-repo-zip</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            <attach>false</attach>
+                            <finalName>stage/${application.name}-${project.version}</finalName>
+                            <descriptors>
+                                <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>installer-zip</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <phase>package</phase>
+                        <configuration>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            <attach>true</attach>
+                            <finalName>${application.name}-${project.version}</finalName>
+                            <descriptors>
+                                <descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+                            </descriptors>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <phase>prepare-package</phase>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>true</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                            <useRepositoryLayout>true</useRepositoryLayout>
+                            <addParentPoms>false</addParentPoms>
+                            <copyPom>false</copyPom>
+                            <excludeGroupIds>org.opendaylight</excludeGroupIds>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy-version</id>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <!-- here the phase you need -->
+                        <phase>validate</phase>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/stage</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>src/main/resources/scripts</directory>
+                                    <includes>
+                                        <include>install-feature.sh</include>
+                                    </includes>
+                                    <filtering>true</filtering>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 0000000..4b7b6f3
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,60 @@
+<!--

+  ============LICENSE_START=======================================================
+  ONAP : APPC
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Copyright (C) 2017 Amdocs

+  =============================================================================

+  Licensed under the Apache License, Version 2.0 (the "License");

+  you may not use this file except in compliance with the License.

+  You may obtain a copy of the License at

+  

+       http://www.apache.org/licenses/LICENSE-2.0

+  

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+  

+  ECOMP is a trademark and service mark of AT&T Intellectual Property.
+  ============LICENSE_END=========================================================

+  -->

+

+<!-- Defines how we build the .zip file which is our distribution. -->

+

+<assembly

+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"

+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

+    <id>controller</id>

+    <formats>

+        <format>zip</format>

+    </formats>

+

+    <!--  we want "system" and related files right at the root level

+          as this file is suppose to be unzip on top of a karaf

+          distro. -->

+    <includeBaseDirectory>false</includeBaseDirectory>

+

+    <fileSets>

+        <fileSet>

+            <directory>target/stage/</directory>

+            <outputDirectory>${application.name}</outputDirectory>

+            <fileMode>755</fileMode>

+            <includes>

+                <include>*.sh</include>

+            </includes>

+        </fileSet>

+        <fileSet>

+            <directory>target/stage/</directory>

+            <outputDirectory>${application.name}</outputDirectory>

+            <fileMode>644</fileMode>

+            <excludes>

+                <exclude>*.sh</exclude>

+            </excludes>

+        </fileSet>

+    </fileSets>

+

+</assembly>

diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 0000000..e735845
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,51 @@
+<!--

+  ============LICENSE_START=======================================================
+  ONAP : APPC
+  ================================================================================
+  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+  ================================================================================
+  Copyright (C) 2017 Amdocs

+  =============================================================================

+  Licensed under the Apache License, Version 2.0 (the "License");

+  you may not use this file except in compliance with the License.

+  You may obtain a copy of the License at

+  

+       http://www.apache.org/licenses/LICENSE-2.0

+  

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+  

+  ECOMP is a trademark and service mark of AT&T Intellectual Property.
+  ============LICENSE_END=========================================================

+  -->

+

+<!-- Defines how we build the .zip file which is our distribution. -->

+

+<assembly

+        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"

+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0

+         http://maven.apache.org/xsd/assembly-1.1.0.xsd">

+    <id>controller</id>

+    <formats>

+        <format>zip</format>

+    </formats>

+

+    <!--  we want "system" and related files right at the root level

+          as this file is suppose to be unzip on top of a karaf

+          distro. -->

+    <includeBaseDirectory>false</includeBaseDirectory>

+

+    <fileSets>

+        <fileSet>

+            <directory>target/assembly/</directory>

+            <outputDirectory>.</outputDirectory>

+            <excludes>

+            </excludes>

+        </fileSet>

+    </fileSets>

+

+</assembly>

diff --git a/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh b/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 0000000..4a7e7a1
--- /dev/null
+++ b/appc-lifecycle-management/appc-lifecycle-management-installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,63 @@
+###

+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs

+# =============================================================================

+# Licensed under the Apache License, Version 2.0 (the "License");

+# you may not use this file except in compliance with the License.

+# You may obtain a copy of the License at

+# 

+#      http://www.apache.org/licenses/LICENSE-2.0

+# 

+# Unless required by applicable law or agreed to in writing, software

+# distributed under the License is distributed on an "AS IS" BASIS,

+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+# See the License for the specific language governing permissions and

+# limitations under the License.

+# 

+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# ============LICENSE_END=========================================================

+###

+

+#!/bin/bash

+

+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}

+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}

+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}

+INSTALLERDIR=$(dirname $0)

+

+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip

+

+if [ -f ${REPOZIP} ]

+then

+    unzip -n -d ${ODL_HOME} ${REPOZIP}

+else

+    echo "ERROR : repo zip ($REPOZIP) not found"

+    exit 1

+fi

+

+COUNT=0

+while [ $COUNT -lt 10 ]; do

+    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} 2> /tmp/installErr

+    cat /tmp/installErr

+    if grep -q 'Failed to get the session' /tmp/installErr; then

+        sleep 10

+    else

+        let COUNT=10

+    fi

+    let COUNT=COUNT+1

+done

+COUNT=0

+while [ $COUNT -lt 10 ]; do

+    ${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot} 2> /tmp/installErr

+        cat /tmp/installErr

+    if grep -q 'Failed to get the session' /tmp/installErr; then

+        sleep 10

+    else

+        let COUNT=10

+    fi

+    let COUNT=COUNT+1

+done

diff --git a/appc-lifecycle-management/pom.xml b/appc-lifecycle-management/pom.xml
new file mode 100644
index 0000000..9b5dcfe
--- /dev/null
+++ b/appc-lifecycle-management/pom.xml
@@ -0,0 +1,50 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.openecomp.appc</groupId>
+        <artifactId>appc</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>appc-lifecycle-management</artifactId>
+    <packaging>pom</packaging>
+    <name>APPC Lifecycle Management</name>
+    <description>APPC Lifecycle Management</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.felix</groupId>
+                    <artifactId>maven-bundle-plugin</artifactId>
+                    <extensions>true</extensions>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+    <!-- ================================================================================== -->
+    <!-- The modules we build -->
+    <!-- ================================================================================== -->
+    <modules>
+        <module>appc-lifecycle-management-api</module>
+        <module>state-machine-lib</module>
+        <module>appc-lifecycle-management-core</module>
+        <module>appc-lifecycle-management-features</module>
+        <module>appc-lifecycle-management-installer</module>
+    </modules>
+
+</project>
\ No newline at end of file
diff --git a/appc-lifecycle-management/state-machine-lib/.gitignore b/appc-lifecycle-management/state-machine-lib/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/appc-lifecycle-management/state-machine-lib/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-lifecycle-management/state-machine-lib/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+  <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/appc-lifecycle-management/state-machine-lib/pom.xml b/appc-lifecycle-management/state-machine-lib/pom.xml
new file mode 100644
index 0000000..9618d61
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/pom.xml
@@ -0,0 +1,42 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.openecomp.appc</groupId>
+        <artifactId>appc-lifecycle-management</artifactId>
+        <version>1.1.0-SNAPSHOT</version>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>state-machine-lib</artifactId>
+    <packaging>bundle</packaging>
+
+    <name>state-machine-lib</name>
+    <url>http://maven.apache.org</url>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.openecomp.appc</groupId>
+            <artifactId>appc-lifecycle-management-api</artifactId>
+            <version>1.1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Bundle-Version>${project.version}</Bundle-Version>
+                        <Export-Package>org.openecomp.appc.statemachine.*</Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java
new file mode 100644
index 0000000..1c74861
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMachine.java
@@ -0,0 +1,34 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine;

+

+import org.openecomp.appc.exceptions.InvalidInputException;

+import org.openecomp.appc.statemachine.objects.Event;

+import org.openecomp.appc.statemachine.objects.State;

+import org.openecomp.appc.statemachine.objects.StateMachineResponse;

+

+public interface StateMachine {

+    StateMachineResponse handleEvent(State currentState, Event event) throws InvalidInputException;

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java
new file mode 100644
index 0000000..0ddbd2f
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/StateMetaDataReader.java
@@ -0,0 +1,31 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine;

+

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+

+public interface StateMetaDataReader {

+    StateMachineMetadata readMetadata();

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java
new file mode 100644
index 0000000..6c7951f
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineFactory.java
@@ -0,0 +1,40 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl;

+

+import org.openecomp.appc.statemachine.StateMachine;

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+

+

+public class StateMachineFactory {

+

+    private StateMachineFactory(){

+

+    }

+

+    public static StateMachine getStateMachine(StateMachineMetadata metadata){

+        return new StateMachineImpl(metadata);

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java
new file mode 100644
index 0000000..124cf36
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/StateMachineImpl.java
@@ -0,0 +1,98 @@
+/*-

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

+ * ONAP : APPC

+ * ================================================================================

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

+ * ================================================================================

+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 

+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 

+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.

+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl;

+

+import java.util.HashSet;

+import java.util.Set;

+

+import org.openecomp.appc.exceptions.InvalidInputException;

+import org.openecomp.appc.statemachine.StateMachine;

+import org.openecomp.appc.statemachine.objects.Event;

+import org.openecomp.appc.statemachine.objects.Response;

+import org.openecomp.appc.statemachine.objects.State;

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+import org.openecomp.appc.statemachine.objects.StateMachineResponse;

+import org.openecomp.appc.statemachine.objects.Transition;

+

+

+public class StateMachineImpl implements StateMachine {

+

+    private final Set<State> states;

+

+    private final Set<Event> events;

+

+    StateMachineImpl(StateMachineMetadata metadata){

+        this.states = new HashSet<>();

+        this.states.addAll(metadata.getStates());

+        this.events = new HashSet<>();

+        this.events.addAll(metadata.getEvents());

+    }

+

+    public StateMachineResponse handleEvent(State inputState, Event event) throws InvalidInputException{

+

+        if(!validateInputs(inputState,event)){

+            throw new InvalidInputException("VNF State or incoming event is invalid. State = " +inputState + " event = " + event );

+        }

+

+        StateMachineResponse response = new StateMachineResponse();

+        State currentState = null,nextState = null;

+        for(State stateInSet:states){

+            if(stateInSet.equals(inputState)){

+                currentState = stateInSet;

+                break;

+            }

+        }

+        if (currentState != null) {

+            for (Transition transition : currentState.getTransitions()) {

+                if (event.equals(transition.getEvent())) {

+                    nextState = transition.getNextState();

+                }

+            }

+        }

+        if(nextState == null){

+            response.setResponse(Response.NO_TRANSITION_DEFINED);

+        }

+        else if(inputState.equals(nextState)){

+            response.setResponse(Response.NO_STATE_CHANGE);

+        }

+        else{

+            response.setResponse(Response.VALID_TRANSITION);

+        }

+        response.setNextState(nextState);

+        return response;

+    }

+

+    private boolean validateInputs(State state,Event event) {

+        return state != null && event != null && this.states.contains(state) && this.events.contains(event);

+    }

+

+    @Override

+    public String toString() {

+        return "StateMachineImpl{" +

+                "states=" + states +

+                ", events=" + events +

+                '}';

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java
new file mode 100644
index 0000000..e160e7f
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamMetaDataReader.java
@@ -0,0 +1,107 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl.readers;

+

+import org.openecomp.appc.statemachine.StateMetaDataReader;

+import org.openecomp.appc.statemachine.objects.Event;

+import org.openecomp.appc.statemachine.objects.State;

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+

+public class AppcOamMetaDataReader implements StateMetaDataReader {

+

+    public enum AppcOperation {

+        MaintenanceMode,

+        Restart,

+        Start,

+        Stop

+    }

+

+    @Override

+    public StateMachineMetadata readMetadata() {

+        State NOT_INSTANTIATED = new State(AppcOamStates.NotInstantiated.toString());

+        State INSTANTIATED = new State(AppcOamStates.Instantiated.toString());

+        State RESTARTING = new State(AppcOamStates.Restarting.toString());

+        State STARTING = new State(AppcOamStates.Starting.toString());

+        State STARTED = new State(AppcOamStates.Started.toString());

+        State ENTERING_MAINTENANCE_MODE = new State(AppcOamStates.EnteringMaintenanceMode.toString());

+        State MAINTENANCE_MODE = new State(AppcOamStates.MaintenanceMode.toString());

+        State ERROR = new State(AppcOamStates.Error.toString());

+        State UNKNOWN = new State(AppcOamStates.Unknown.toString());

+        State STOPPING = new State(AppcOamStates.Stopping.toString());

+        State STOPPED = new State(AppcOamStates.Stopped.toString());

+

+        Event START = new Event(AppcOperation.Start.toString());

+        Event STOP = new Event(AppcOperation.Stop.toString());

+        Event MAINTENANCE_MODE_EVENT = new Event(AppcOperation.MaintenanceMode.toString());

+        Event RESTART = new Event(AppcOperation.Restart.toString());

+

+        StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata

+                .StateMachineMetadataBuilder();

+

+        builder = builder.addState(NOT_INSTANTIATED);

+        builder = builder.addState(INSTANTIATED);

+        builder = builder.addState(STARTING);

+        builder = builder.addState(STARTED);

+        builder = builder.addState(ERROR);

+        builder = builder.addState(UNKNOWN);

+        builder = builder.addState(STOPPING);

+        builder = builder.addState(STOPPED);

+        builder = builder.addState(ENTERING_MAINTENANCE_MODE);

+        builder = builder.addState(MAINTENANCE_MODE);

+        builder = builder.addState(RESTARTING);

+

+        builder = builder.addEvent(START);

+        builder = builder.addEvent(STOP);

+        builder = builder.addEvent(RESTART);

+        builder = builder.addEvent(MAINTENANCE_MODE_EVENT);

+

+        /*

+         *  for addTransition:

+         *  param 1: current state; param 2: received command/request; param 3: new transition state

+         */

+        // start

+        builder = builder.addTransition(STOPPED,                   START, STARTING);

+        builder = builder.addTransition(MAINTENANCE_MODE,          START, STARTING);

+        builder = builder.addTransition(ERROR,                     START, STARTING);

+        // stop

+        builder = builder.addTransition(STARTED,                   STOP, STOPPING);

+        builder = builder.addTransition(STARTING,                  STOP, STOPPING);

+        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, STOP, STOPPING);

+        builder = builder.addTransition(MAINTENANCE_MODE,          STOP, STOPPING);

+        builder = builder.addTransition(ERROR,                     STOP, STOPPING);

+        // maintenance mode

+        builder = builder.addTransition(

+                STARTED, MAINTENANCE_MODE_EVENT, ENTERING_MAINTENANCE_MODE);

+        // restart

+        builder = builder.addTransition(STOPPED,                   RESTART, RESTARTING);

+        builder = builder.addTransition(STARTING,                  RESTART, RESTARTING);

+        builder = builder.addTransition(STARTED,                   RESTART, RESTARTING);

+        builder = builder.addTransition(ENTERING_MAINTENANCE_MODE, RESTART, RESTARTING);

+        builder = builder.addTransition(MAINTENANCE_MODE,          RESTART, RESTARTING);

+        builder = builder.addTransition(ERROR,                     RESTART, RESTARTING);

+

+        return builder.build();

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java
new file mode 100644
index 0000000..2f000d9
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStates.java
@@ -0,0 +1,56 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl.readers;

+

+import org.osgi.framework.Bundle;

+

+public enum AppcOamStates {

+    EnteringMaintenanceMode(0),

+    Error(0),

+    Instantiated(Bundle.INSTALLED),

+    MaintenanceMode(0),

+    NotInstantiated(Bundle.UNINSTALLED),

+    Restarting(0),

+    Started(Bundle.ACTIVE),

+    Starting(Bundle.STARTING),

+    Stopped(Bundle.RESOLVED),

+    Stopping(Bundle.STOPPING),

+    Unknown(0);

+

+    int osgiBundleState;

+

+    AppcOamStates(Integer bundleState) {

+        osgiBundleState = bundleState;

+    }

+

+    public static AppcOamStates getOamStateFromBundleState(int bundleState) {

+        for (AppcOamStates aState : values()) {

+            if (aState.osgiBundleState == bundleState) {

+                return aState;

+            }

+        }

+        return Unknown;

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java
new file mode 100644
index 0000000..e3e72f6
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/impl/readers/VnfMetaDataReader.java
@@ -0,0 +1,483 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl.readers;

+

+import org.openecomp.appc.statemachine.StateMetaDataReader;

+import org.openecomp.appc.lifecyclemanager.objects.VNFOperationOutcome;

+import org.openecomp.appc.statemachine.objects.Event;

+import org.openecomp.appc.statemachine.objects.State;

+import org.openecomp.appc.statemachine.objects.StateMachineMetadata;

+

+public class VnfMetaDataReader implements StateMetaDataReader {

+

+    public enum VNFOperation {

+

+        Configure, Test, HealthCheck, Start, Terminate, Restart, Rebuild, Stop, ConfigModify,

+        ConfigScaleOut,ConfigRestore,Backup, Snapshot,

+        SoftwareUpload, LiveUpgrade, Rollback, Sync, Audit, Test_lic, Migrate, Evacuate,

+        ConfigBackup, ConfigBackupDelete, ConfigExport,

+        Lock(true), Unlock(true), CheckLock(true), StartApplication,StopApplication;

+

+        private boolean builtIn;

+

+        VNFOperation(boolean builtIn) {

+            this.builtIn = builtIn;

+        }

+

+        VNFOperation() {

+            this(false);

+        }

+    }

+

+    private enum VNFStates {

+        Not_Instantiated, Instantiated, Configuring, Configured, Testing, Tested, Rebuilding, Restarting, Starting,

+        Error, Running, Unknown, Terminating, Stopping, Stopped,

+        Backing_Up, Snapshotting, Software_Uploading, Upgrading, Rollbacking, Licensing, Migrating, Evacuating,

+        NOT_ORCHESTRATED("NOT ORCHESTRATED"), Created;

+

+        String stateName;

+

+        VNFStates(String name) {

+            this.stateName = name;

+        }

+

+        VNFStates() {

+            this.stateName = name();

+        }

+

+        @Override

+        public String toString() {

+            return this.stateName;

+        }

+    }

+

+    public StateMachineMetadata readMetadata() {

+        {

+            State NOT_INSTANTIATED = new State(VNFStates.Not_Instantiated.toString());

+            State INSTANTIATED = new State(VNFStates.Instantiated.toString());

+            State CONFIGURING = new State(VNFStates.Configuring.toString());

+            State CONFIGURED = new State(VNFStates.Configured.toString());

+            State TESTING = new State(VNFStates.Testing.toString());

+            State TESTED = new State(VNFStates.Tested.toString());

+            State REBUILDING = new State(VNFStates.Rebuilding.toString());

+            State RESTARTING = new State(VNFStates.Restarting.toString());

+            State STARTING = new State(VNFStates.Starting.toString());

+            State ERROR = new State(VNFStates.Error.toString());

+            State RUNNING = new State(VNFStates.Running.toString());

+            State UNKNOWN = new State(VNFStates.Unknown.toString());

+            State TERMINATING = new State(VNFStates.Terminating.toString());

+            State STOPPING = new State(VNFStates.Stopping.toString());

+            State STOPPED = new State(VNFStates.Stopped.toString());

+            State NOT_ORCHESTRATED = new State(VNFStates.NOT_ORCHESTRATED.toString());

+

+            State BACKING_UP = new State(VNFStates.Backing_Up.toString());

+            State SNAPSHOTTING = new State(VNFStates.Snapshotting.toString());

+            State SOFTWARE_UPLOADING = new State(VNFStates.Software_Uploading.toString());

+            State UPGRADING = new State(VNFStates.Upgrading.toString());

+            State ROLLBACKING = new State(VNFStates.Rollbacking.toString());

+

+            State MIGRATING = new State(VNFStates.Migrating.toString());

+            State EVACUATING = new State(VNFStates.Evacuating.toString());

+            State CREATED= new State(VNFStates.Created.toString());

+

+            Event START_APPLICATION = new Event(VNFOperation.StartApplication.toString());

+            Event CONFIGURE = new Event(VNFOperation.Configure.toString());

+            Event HEALTHCHECK = new Event(VNFOperation.HealthCheck.toString());

+            Event TEST = new Event(VNFOperation.Test.toString());

+            Event START = new Event(VNFOperation.Start.toString());

+            Event TERMINATE = new Event(VNFOperation.Terminate.toString());

+            Event RESTART = new Event(VNFOperation.Restart.toString());

+            Event REBUILD = new Event(VNFOperation.Rebuild.toString());

+            Event STOP = new Event(VNFOperation.Stop.toString());

+            Event CONFIG_MODIFY = new Event(VNFOperation.ConfigModify.toString());

+            Event CONFIG_SCALEOUT = new Event(VNFOperation.ConfigScaleOut.toString());

+            Event CONFIG_RESTORE = new Event(VNFOperation.ConfigRestore.toString());

+            Event BACKUP = new Event(VNFOperation.Backup.toString());

+            Event SNAPSHOT = new Event(VNFOperation.Snapshot.toString());

+            Event SOFTWARE_UPLOAD = new Event(VNFOperation.SoftwareUpload.toString());

+            Event LIVE_UPGRADE = new Event(VNFOperation.LiveUpgrade.toString());

+            Event ROLLBACK = new Event(VNFOperation.Rollback.toString());

+            Event SYNC = new Event(VNFOperation.Sync.toString());

+            Event AUDIT = new Event(VNFOperation.Audit.toString());

+            Event MIGRATE = new Event(VNFOperation.Migrate.toString());

+            Event EVACUATE = new Event(VNFOperation.Evacuate.toString());

+            Event CONFIG_BACKUP = new Event(VNFOperation.ConfigBackup.toString());

+            Event CONFIG_BACKUP_DELETE = new Event(VNFOperation.ConfigBackupDelete.toString());

+            Event CONFIG_EXPORT = new Event(VNFOperation.ConfigExport.toString());

+            Event STOP_APPLICATION= new Event(VNFOperation.StopApplication.toString());

+

+            Event LOCK = new Event(VNFOperation.Lock.toString());

+            Event UNLOCK = new Event(VNFOperation.Unlock.toString());

+            Event CHECKLOCK = new Event(VNFOperation.CheckLock.toString());

+

+            Event SUCCESS = new Event(VNFOperationOutcome.SUCCESS.toString());

+            Event FAILURE = new Event(VNFOperationOutcome.FAILURE.toString());

+

+

+            StateMachineMetadata.StateMachineMetadataBuilder builder = new StateMachineMetadata.StateMachineMetadataBuilder();

+

+            builder = builder.addState(NOT_INSTANTIATED);

+            builder = builder.addState(INSTANTIATED);

+            builder = builder.addState(CONFIGURING);

+            builder = builder.addState(CONFIGURED);

+            builder = builder.addState(TESTING);

+            builder = builder.addState(TESTED);

+            builder = builder.addState(REBUILDING);

+            builder = builder.addState(RESTARTING);

+            builder = builder.addState(STARTING);

+            builder = builder.addState(ERROR);

+            builder = builder.addState(RUNNING);

+            builder = builder.addState(UNKNOWN);

+            builder = builder.addState(TERMINATING);

+            builder = builder.addState(STOPPING);

+            builder = builder.addState(STOPPED);

+

+            builder = builder.addState(BACKING_UP);

+            builder = builder.addState(SNAPSHOTTING);

+            builder = builder.addState(SOFTWARE_UPLOADING);

+            builder = builder.addState(UPGRADING);

+            builder = builder.addState(ROLLBACKING);

+            builder = builder.addState(MIGRATING);

+            builder = builder.addState(EVACUATING);

+            builder = builder.addState(NOT_ORCHESTRATED);

+            builder = builder.addState(CREATED);

+            builder = builder.addEvent(START_APPLICATION);

+            builder = builder.addEvent(CONFIGURE);

+            builder = builder.addEvent(TEST);

+            builder = builder.addEvent(START);

+            builder = builder.addEvent(TERMINATE);

+            builder = builder.addEvent(RESTART);

+            builder = builder.addEvent(REBUILD);

+            builder = builder.addEvent(SUCCESS);

+            builder = builder.addEvent(FAILURE);

+            builder = builder.addEvent(STOP);

+            builder = builder.addEvent(CONFIG_MODIFY);

+            builder = builder.addEvent(CONFIG_SCALEOUT);

+            builder = builder.addEvent(CONFIG_RESTORE);

+            builder = builder.addEvent(HEALTHCHECK);

+            builder = builder.addEvent(BACKUP);

+            builder = builder.addEvent(SNAPSHOT);

+            builder = builder.addEvent(SOFTWARE_UPLOAD);

+            builder = builder.addEvent(LIVE_UPGRADE);

+            builder = builder.addEvent(ROLLBACK);

+            builder = builder.addEvent(SYNC);

+            builder = builder.addEvent(AUDIT);

+            builder = builder.addEvent(MIGRATE);

+            builder = builder.addEvent(EVACUATE);

+            builder = builder.addEvent(LOCK);

+            builder = builder.addEvent(UNLOCK);

+            builder = builder.addEvent(CHECKLOCK);

+            builder = builder.addEvent(CONFIG_BACKUP);

+            builder = builder.addEvent(CONFIG_BACKUP_DELETE);

+            builder = builder.addEvent(CONFIG_EXPORT);

+            builder = builder.addEvent(STOP_APPLICATION);

+

+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,TEST,TESTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,START,STARTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,RESTART,RESTARTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,REBUILD,REBUILDING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,STOP,STOPPING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(NOT_ORCHESTRATED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,LOCK,NOT_ORCHESTRATED);

+            builder = builder.addTransition(NOT_ORCHESTRATED,UNLOCK,NOT_ORCHESTRATED);

+            builder = builder.addTransition(NOT_ORCHESTRATED,CHECKLOCK,NOT_ORCHESTRATED);

+            builder = builder.addTransition(NOT_ORCHESTRATED,START_APPLICATION,STARTING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,STOP_APPLICATION,STOPPING);

+            builder = builder.addTransition(NOT_ORCHESTRATED,CONFIG_BACKUP,NOT_ORCHESTRATED);

+

+            builder = builder.addTransition(CREATED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(CREATED,TEST,TESTING);

+            builder = builder.addTransition(CREATED,START,STARTING);

+            builder = builder.addTransition(CREATED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(CREATED,RESTART,RESTARTING);

+            builder = builder.addTransition(CREATED,REBUILD,REBUILDING);

+            builder = builder.addTransition(CREATED,STOP,STOPPING);

+            builder = builder.addTransition(CREATED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(CREATED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(CREATED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(CREATED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(CREATED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(CREATED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(CREATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(CREATED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(CREATED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(CREATED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(CREATED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(CREATED,LOCK,CREATED);

+            builder = builder.addTransition(CREATED,UNLOCK,CREATED);

+            builder = builder.addTransition(CREATED,CHECKLOCK,CREATED);

+            builder = builder.addTransition(CREATED,START_APPLICATION,STARTING);

+            builder = builder.addTransition(CREATED,STOP_APPLICATION,STOPPING);

+            builder = builder.addTransition(CREATED,CONFIG_BACKUP,CREATED);

+

+            builder = builder.addTransition(INSTANTIATED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(INSTANTIATED,TEST,TESTING);

+            builder = builder.addTransition(INSTANTIATED,START,STARTING);

+            builder = builder.addTransition(INSTANTIATED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(INSTANTIATED,RESTART,RESTARTING);

+            builder = builder.addTransition(INSTANTIATED,REBUILD,REBUILDING);

+            builder = builder.addTransition(INSTANTIATED,STOP,STOPPING);

+            builder = builder.addTransition(INSTANTIATED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(INSTANTIATED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(INSTANTIATED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(INSTANTIATED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(INSTANTIATED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(INSTANTIATED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(INSTANTIATED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(INSTANTIATED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(INSTANTIATED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(INSTANTIATED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(INSTANTIATED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(INSTANTIATED,LOCK,INSTANTIATED);

+            builder = builder.addTransition(INSTANTIATED,UNLOCK,INSTANTIATED);

+            builder = builder.addTransition(INSTANTIATED,CHECKLOCK,INSTANTIATED);

+

+            builder = builder.addTransition(CONFIGURED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(CONFIGURED,TEST,TESTING);

+            builder = builder.addTransition(CONFIGURED,START,STARTING);

+            builder = builder.addTransition(CONFIGURED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(CONFIGURED,RESTART,RESTARTING);

+            builder = builder.addTransition(CONFIGURED,REBUILD,REBUILDING);

+            builder = builder.addTransition(CONFIGURED,STOP,STOPPING);

+            builder = builder.addTransition(CONFIGURED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(CONFIGURED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(CONFIGURED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(CONFIGURED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(CONFIGURED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(CONFIGURED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(CONFIGURED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(CONFIGURED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(CONFIGURED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(CONFIGURED,SYNC,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,AUDIT,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(CONFIGURED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(CONFIGURED,LOCK,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,UNLOCK,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,CHECKLOCK,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,CONFIG_BACKUP_DELETE,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,CONFIG_EXPORT,CONFIGURED);

+            builder = builder.addTransition(CONFIGURED,STOP_APPLICATION,STOPPING);

+

+            builder = builder.addTransition(TESTED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(TESTED,TEST,TESTING);

+            builder = builder.addTransition(TESTED,START,STARTING);

+            builder = builder.addTransition(TESTED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(TESTED,RESTART,RESTARTING);

+            builder = builder.addTransition(TESTED,REBUILD,REBUILDING);

+            builder = builder.addTransition(TESTED,STOP,STOPPING);

+            builder = builder.addTransition(TESTED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(TESTED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(TESTED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(TESTED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(TESTED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(TESTED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(TESTED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(TESTED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(TESTED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(TESTED,SYNC,TESTED);

+            builder = builder.addTransition(TESTED,AUDIT,TESTED);

+            builder = builder.addTransition(TESTED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(TESTED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(TESTED,LOCK,TESTED);

+            builder = builder.addTransition(TESTED,UNLOCK,TESTED);

+            builder = builder.addTransition(TESTED,CHECKLOCK,TESTED);

+            builder = builder.addTransition(TESTED,CONFIG_BACKUP,TESTED);

+            builder = builder.addTransition(TESTED,CONFIG_BACKUP_DELETE,TESTED);

+            builder = builder.addTransition(TESTED,CONFIG_EXPORT,TESTED);

+            builder = builder.addTransition(TESTED,STOP_APPLICATION,STOPPING);

+

+            builder = builder.addTransition(RUNNING,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(RUNNING,TEST,TESTING);

+            builder = builder.addTransition(RUNNING,START,STARTING);

+            builder = builder.addTransition(RUNNING,TERMINATE,TERMINATING);

+            builder = builder.addTransition(RUNNING,RESTART,RESTARTING);

+            builder = builder.addTransition(RUNNING,REBUILD,REBUILDING);

+            builder = builder.addTransition(RUNNING,STOP,STOPPING);

+            builder = builder.addTransition(RUNNING,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(RUNNING,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(RUNNING,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(RUNNING,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(RUNNING,BACKUP,BACKING_UP);

+            builder = builder.addTransition(RUNNING,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(RUNNING,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(RUNNING,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(RUNNING,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(RUNNING,SYNC,RUNNING);

+            builder = builder.addTransition(RUNNING,AUDIT,RUNNING);

+            builder = builder.addTransition(RUNNING,MIGRATE,MIGRATING);

+            builder = builder.addTransition(RUNNING,EVACUATE,EVACUATING);

+            builder = builder.addTransition(RUNNING,LOCK,RUNNING);

+            builder = builder.addTransition(RUNNING,UNLOCK,RUNNING);

+            builder = builder.addTransition(RUNNING,CHECKLOCK,RUNNING);

+            builder = builder.addTransition(RUNNING,CONFIG_BACKUP,RUNNING);

+            builder = builder.addTransition(RUNNING,CONFIG_BACKUP_DELETE,RUNNING);

+            builder = builder.addTransition(RUNNING,CONFIG_EXPORT,RUNNING);

+            builder = builder.addTransition(RUNNING,STOP_APPLICATION,STOPPING);

+

+            builder = builder.addTransition(ERROR,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(ERROR,TEST,TESTING);

+            builder = builder.addTransition(ERROR,START,STARTING);

+            builder = builder.addTransition(ERROR,TERMINATE,TERMINATING);

+            builder = builder.addTransition(ERROR,RESTART,RESTARTING);

+            builder = builder.addTransition(ERROR,REBUILD,REBUILDING);

+            builder = builder.addTransition(ERROR,STOP,STOPPING);

+            builder = builder.addTransition(ERROR,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(ERROR,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(ERROR,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(ERROR,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(ERROR,BACKUP,BACKING_UP);

+            builder = builder.addTransition(ERROR,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(ERROR,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(ERROR,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(ERROR,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(ERROR,SYNC,ERROR);

+            builder = builder.addTransition(ERROR,AUDIT,ERROR);

+            builder = builder.addTransition(ERROR,MIGRATE,MIGRATING);

+            builder = builder.addTransition(ERROR,EVACUATE,EVACUATING);

+            builder = builder.addTransition(ERROR,LOCK,ERROR);

+            builder = builder.addTransition(ERROR,UNLOCK,ERROR);

+            builder = builder.addTransition(ERROR,CHECKLOCK,ERROR);

+            builder = builder.addTransition(ERROR,CONFIG_BACKUP,ERROR);

+            builder = builder.addTransition(ERROR,CONFIG_BACKUP_DELETE,ERROR);

+            builder = builder.addTransition(ERROR,CONFIG_EXPORT,ERROR);

+            builder = builder.addTransition(ERROR,STOP_APPLICATION,STOPPING);

+

+            builder = builder.addTransition(UNKNOWN,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(UNKNOWN,TEST,TESTING);

+            builder = builder.addTransition(UNKNOWN,START,STARTING);

+            builder = builder.addTransition(UNKNOWN,TERMINATE,TERMINATING);

+            builder = builder.addTransition(UNKNOWN,RESTART,RESTARTING);

+            builder = builder.addTransition(UNKNOWN,REBUILD,REBUILDING);

+            builder = builder.addTransition(UNKNOWN,STOP,STOPPING);

+            builder = builder.addTransition(UNKNOWN,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(UNKNOWN,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(UNKNOWN,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(UNKNOWN,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(UNKNOWN,BACKUP,BACKING_UP);

+            builder = builder.addTransition(UNKNOWN,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(UNKNOWN,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(UNKNOWN,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(UNKNOWN,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(UNKNOWN,SYNC,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,AUDIT,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,MIGRATE,MIGRATING);

+            builder = builder.addTransition(UNKNOWN,EVACUATE,EVACUATING);

+            builder = builder.addTransition(UNKNOWN,LOCK,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,UNLOCK,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,CHECKLOCK,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,CONFIG_BACKUP_DELETE,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,CONFIG_EXPORT,UNKNOWN);

+            builder = builder.addTransition(UNKNOWN,STOP_APPLICATION,STOPPING);

+

+            builder = builder.addTransition(STOPPED,CONFIGURE,CONFIGURING);

+            builder = builder.addTransition(STOPPED,TEST,TESTING);

+            builder = builder.addTransition(STOPPED,START,STARTING);

+            builder = builder.addTransition(STOPPED,TERMINATE,TERMINATING);

+            builder = builder.addTransition(STOPPED,RESTART,RESTARTING);

+            builder = builder.addTransition(STOPPED,REBUILD,REBUILDING);

+            builder = builder.addTransition(STOPPED,CONFIG_MODIFY,CONFIGURING);

+            builder = builder.addTransition(STOPPED,CONFIG_SCALEOUT,CONFIGURING);

+            builder = builder.addTransition(STOPPED,CONFIG_RESTORE,CONFIGURING);

+            builder = builder.addTransition(STOPPED,HEALTHCHECK,TESTING);

+            builder = builder.addTransition(STOPPED,BACKUP,BACKING_UP);

+            builder = builder.addTransition(STOPPED,SNAPSHOT,SNAPSHOTTING);

+            builder = builder.addTransition(STOPPED,SOFTWARE_UPLOAD,SOFTWARE_UPLOADING);

+            builder = builder.addTransition(STOPPED,LIVE_UPGRADE,UPGRADING);

+            builder = builder.addTransition(STOPPED,ROLLBACK,ROLLBACKING);

+            builder = builder.addTransition(STOPPED,MIGRATE,MIGRATING);

+            builder = builder.addTransition(STOPPED,EVACUATE,EVACUATING);

+            builder = builder.addTransition(STOPPED,LOCK,STOPPED);

+            builder = builder.addTransition(STOPPED,UNLOCK,STOPPED);

+            builder = builder.addTransition(STOPPED,CHECKLOCK,STOPPED);

+

+            builder = builder.addTransition(CONFIGURING,SUCCESS,CONFIGURED);

+            builder = builder.addTransition(CONFIGURING,FAILURE,ERROR);

+

+            builder = builder.addTransition(TESTING,SUCCESS,TESTED);

+            builder = builder.addTransition(TESTING,FAILURE,ERROR);

+

+            builder = builder.addTransition(RESTARTING,SUCCESS,RUNNING);

+            builder = builder.addTransition(RESTARTING,FAILURE,ERROR);

+

+            builder = builder.addTransition(STARTING,SUCCESS,RUNNING);

+            builder = builder.addTransition(STARTING,FAILURE,ERROR);

+

+            builder = builder.addTransition(TERMINATING,SUCCESS,NOT_INSTANTIATED);

+            builder = builder.addTransition(TERMINATING,FAILURE,ERROR);

+

+            builder = builder.addTransition(REBUILDING,SUCCESS,RUNNING);

+            builder = builder.addTransition(REBUILDING,FAILURE,ERROR);

+

+            builder = builder.addTransition(STOPPING,SUCCESS,STOPPED);

+            builder = builder.addTransition(STOPPING,FAILURE,ERROR);

+

+            builder = builder.addTransition(BACKING_UP,SUCCESS,RUNNING);

+            builder = builder.addTransition(BACKING_UP,FAILURE,ERROR);

+

+            builder = builder.addTransition(SNAPSHOTTING,SUCCESS,RUNNING);

+            builder = builder.addTransition(SNAPSHOTTING,FAILURE,ERROR);

+

+            builder = builder.addTransition(SOFTWARE_UPLOADING,SUCCESS,RUNNING);

+            builder = builder.addTransition(SOFTWARE_UPLOADING,FAILURE,ERROR);

+

+            builder = builder.addTransition(UPGRADING,SUCCESS,RUNNING);

+            builder = builder.addTransition(UPGRADING,FAILURE,ERROR);

+

+            builder = builder.addTransition(ROLLBACKING,SUCCESS,RUNNING);

+            builder = builder.addTransition(ROLLBACKING,FAILURE,ERROR);

+

+            builder = builder.addTransition(MIGRATING,SUCCESS,RUNNING);

+            builder = builder.addTransition(MIGRATING,FAILURE,ERROR);

+

+            builder = builder.addTransition(EVACUATING,SUCCESS,RUNNING);

+            builder = builder.addTransition(EVACUATING,FAILURE,ERROR);

+

+

+            builder = builder.addTransition(CONFIGURED,START_APPLICATION,STARTING);

+            builder = builder.addTransition(TESTED,START_APPLICATION,STARTING);

+            builder = builder.addTransition(ERROR,START_APPLICATION,STARTING);

+            builder = builder.addTransition(UNKNOWN,START_APPLICATION,STARTING);

+            builder = builder.addTransition(RUNNING,START_APPLICATION,STARTING);

+

+            return builder.build();

+

+        }

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java
new file mode 100644
index 0000000..0808b1b
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Event.java
@@ -0,0 +1,65 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+public class Event{

+

+    private String eventName;

+

+    private Event(){

+        // do nothing

+    }

+

+    @Override

+    public int hashCode(){

+        return this.eventName.hashCode();

+    }

+

+    @Override

+    public boolean equals(Object obj){

+        if(obj == null){

+            return false;

+        }

+        if(!(obj instanceof Event)){

+            return false;

+        }

+        Event event = (Event)obj;

+        return this.eventName.equals(event.getEventName());

+    }

+

+    public Event(String eventName){

+        this();

+        this.eventName = eventName;

+    }

+

+    private String getEventName() {

+        return eventName;

+    }

+

+    @Override

+    public String toString(){

+        return this.eventName;

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java
new file mode 100644
index 0000000..622a427
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Response.java
@@ -0,0 +1,32 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+public enum Response {

+    NO_TRANSITION_DEFINED,NO_STATE_CHANGE,VALID_TRANSITION;

+    public String toString(){

+        return this.name();

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java
new file mode 100644
index 0000000..99d6a0a
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/State.java
@@ -0,0 +1,77 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+import java.util.ArrayList;

+import java.util.List;

+

+public class State{

+    private String stateName;

+    private List<Transition> transitions;

+

+    private State(){

+        // do nothing

+    }

+

+    public State(String state){

+        this();

+        this.stateName = state;

+        this.transitions = new ArrayList<>();

+    }

+

+    @Override

+    public int hashCode(){

+        return this.stateName.hashCode();

+    }

+

+    @Override

+    public boolean equals(Object obj){

+        if(obj == null){

+            return false;

+        }

+        if(!(obj instanceof State)){

+            return false;

+        }

+        State state = (State)obj;

+        return this.stateName.equalsIgnoreCase(state.getStateName());

+    }

+

+    public String getStateName(){

+        return stateName;

+    }

+

+    void addTransition(Transition transition){

+        this.transitions.add(transition);

+    }

+

+    public List<Transition> getTransitions() {

+        return transitions;

+    }

+

+    @Override

+    public String toString(){

+        return this.stateName;

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java
new file mode 100644
index 0000000..5a8984c
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineMetadata.java
@@ -0,0 +1,78 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+import java.util.HashSet;

+import java.util.Set;

+

+public class StateMachineMetadata {

+

+    private Set<State> states;

+    private Set<Event> events;

+

+    private StateMachineMetadata(StateMachineMetadataBuilder builder){

+        states = builder.states;

+        events = builder.events;

+    }

+

+    public Set<State> getStates() {

+        return states;

+    }

+

+    public Set<Event> getEvents() {

+        return events;

+    }

+

+    public static class StateMachineMetadataBuilder{

+

+        private Set<State> states;

+        private Set<Event> events;

+

+        public StateMachineMetadataBuilder(){

+            states = new HashSet<>();

+            events = new HashSet<>();

+        }

+

+        public StateMachineMetadataBuilder addState(State state){

+            this.states.add(state);

+            return this;

+        }

+

+        public StateMachineMetadataBuilder addEvent(Event event){

+            this.events.add(event);

+            return this;

+        }

+

+        public StateMachineMetadataBuilder addTransition(State currentState,Event event,State nextState){

+            Transition transition = new Transition(event,nextState);

+            currentState.addTransition(transition);

+            return this;

+        }

+

+        public StateMachineMetadata build(){

+            return new StateMachineMetadata(this);

+        }

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java
new file mode 100644
index 0000000..7f78087
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/StateMachineResponse.java
@@ -0,0 +1,51 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+

+public class StateMachineResponse {

+    private State nextState;

+    private Response response;

+

+    public StateMachineResponse(){

+        // do nothing

+    }

+

+    public State getNextState() {

+        return nextState;

+    }

+

+    public Response getResponse() {

+        return response;

+    }

+

+    public void setNextState(State nextState) {

+        this.nextState = nextState;

+    }

+

+    public void setResponse(Response response) {

+        this.response = response;

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java
new file mode 100644
index 0000000..b050268
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/main/java/org/openecomp/appc/statemachine/objects/Transition.java
@@ -0,0 +1,48 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.objects;

+

+public class Transition {

+    private Event event;

+    private State nextState;

+

+    private Transition(){

+        // do nothing

+    }

+

+    Transition(Event event, State nextState){

+        this();

+        this.event = event;

+        this.nextState = nextState;

+    }

+

+    public Event getEvent() {

+        return event;

+    }

+

+    public State getNextState() {

+        return nextState;

+    }

+}

diff --git a/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java b/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java
new file mode 100644
index 0000000..af08234
--- /dev/null
+++ b/appc-lifecycle-management/state-machine-lib/src/test/java/org/openecomp/appc/statemachine/impl/readers/AppcOamStatesTest.java
@@ -0,0 +1,71 @@
+/*-

+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs

+ * =============================================================================

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0

+ * 
+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ * 
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================

+ */

+

+package org.openecomp.appc.statemachine.impl.readers;

+

+import org.junit.Assert;

+import org.junit.Test;

+import org.osgi.framework.Bundle;

+

+import java.util.HashMap;

+import java.util.Map;

+

+public class AppcOamStatesTest {

+

+    @Test

+    public void testBasicFunctions() {

+        AppcOamStates aState = AppcOamStates.EnteringMaintenanceMode;

+        Assert.assertEquals("name() does not match", "EnteringMaintenanceMode", aState.name());

+        Assert.assertEquals("toString() does not match", "EnteringMaintenanceMode", aState.toString());

+        Assert.assertEquals("osgiBundleState does not match", 0, aState.osgiBundleState);

+    }

+

+    @Test

+    public void testGetOamStateFromBundleState() {

+        Map<Integer, AppcOamStates> resultMap = new HashMap<Integer, AppcOamStates>() {

+            {

+                put(Bundle.UNINSTALLED,     AppcOamStates.NotInstantiated);

+                put(Bundle.INSTALLED,       AppcOamStates.Instantiated);

+                put(Bundle.RESOLVED,        AppcOamStates.Stopped);

+                put(Bundle.STARTING,        AppcOamStates.Starting);

+                put(Bundle.STOPPING,        AppcOamStates.Stopping);

+                put(Bundle.ACTIVE,          AppcOamStates.Started);

+            }

+        };

+        for (Map.Entry<Integer, AppcOamStates> aEntry : resultMap.entrySet()) {

+            Integer bundleState = aEntry.getKey();

+            AppcOamStates oamState = aEntry.getValue();

+            Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with oamState(%s)",

+                    bundleState, oamState), oamState, AppcOamStates.getOamStateFromBundleState(bundleState));

+        }

+

+        int bundleState = Bundle.START_TRANSIENT;

+        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",

+                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));

+

+        bundleState = Bundle.STOP_TRANSIENT;

+        Assert.assertEquals(String.format("OSGI bundle state(%d) shoule associate with NotInstantiated state.",

+                bundleState), AppcOamStates.NotInstantiated, AppcOamStates.getOamStateFromBundleState(bundleState));

+    }

+}