Initial commit for Sequence Generator
Added sequence generator for start and stop
action with dependency model
Removed java check style from json files
from license maven plugin
JIRA Issues : APPC-33,APPC-106
Issue-Id : APPC-106
Change-Id: I7f12d39b705d77d559790a10b914b8108f5faa5e
Signed-off-by: Kalpesh Chaniyara <kalpeshkumar.chaniyara@amdocs.com>
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/pom.xml b/appc-sequence-generator/appc-sequence-generator-bundle/pom.xml
new file mode 100644
index 0000000..415ae4e
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/pom.xml
@@ -0,0 +1,193 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>appc-sequence-generator-bundle</artifactId>
+ <name>appc-sequence-generator-bundle</name>
+ <packaging>bundle</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>${bundle.plugin.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-sequence-generator-bundle</Bundle-SymbolicName>
+ <!-- <Bundle-Activator>org.openecomp.appc.seqgen.SequenceGeneratorActivator</Bundle-Activator>-->
+ <Export-Package>org.openecomp.appc.seqgen.*</Export-Package>
+ <Import-Package>org.openecomp.appc.domainmodel.lcm,*;resolution:=optional</Import-Package>
+ <DynamicImport-Package>*</DynamicImport-Package>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>config</id>
+ <goals>
+ <goal>generate-sources</goal>
+ </goals>
+ <configuration>
+ <codeGenerators>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+ </codeGeneratorClass>
+ <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
+ <additionalConfiguration>
+ <namespaceToPackage1>
+ urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
+ </namespaceToPackage1>
+ </additionalConfiguration>
+ </generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>${salGeneratorPath}</outputBaseDir>
+ </generator>
+ </codeGenerators>
+ <inspectDependencies>true</inspectDependencies>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>maven-sal-api-gen-plugin</artifactId>
+ <version>${odl.sal.api.gen.plugin.version}</version>
+ <type>jar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-jmx-generator-plugin</artifactId>
+ <version>${odl.yang.jmx.generator.version}</version>
+ </dependency>
+ </dependencies>
+ </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/initial/appc-sequence-generator.xml</file>
+ <type>xml</type>
+ <classifier>config</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-util</artifactId>
+ </dependency>
+ <dependency>
+ <artifactId>sal-test-model</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <artifactId>sal-rest-connector</artifactId>
+ <groupId>org.opendaylight.netconf</groupId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ <classifier>tests</classifier>
+ <version>${odl.mdsal.version}</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-dependency-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-domain-model-lib</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>domain-model-lib</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+</project>
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModule.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModule.java
new file mode 100644
index 0000000..7fa1dcb
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModule.java
@@ -0,0 +1,51 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.impl.rev170706;
+
+import org.openecomp.appc.seqgen.provider.SequenceGeneratorProvider;
+
+public class SequenceGeneratorModule extends org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.impl.rev170706.AbstractSequenceGeneratorModule {
+ public SequenceGeneratorModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+ super(identifier, dependencyResolver);
+ }
+
+ public SequenceGeneratorModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.impl.rev170706.SequenceGeneratorModule oldModule, java.lang.AutoCloseable oldInstance) {
+ super(identifier, dependencyResolver, oldModule, oldInstance);
+ }
+
+ @Override
+ public void customValidation() {
+ // add custom validation form module attributes here.
+ }
+
+ @Override
+ public java.lang.AutoCloseable createInstance() {
+ final SequenceGeneratorProvider provider = new SequenceGeneratorProvider(getDataBrokerDependency(), getNotificationServiceDependency(), getRpcRegistryDependency());
+ return new AutoCloseable() {
+
+ @Override
+ public void close() throws Exception {
+ provider.close();
+ }
+ };
+ }
+
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModuleFactory.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModuleFactory.java
new file mode 100644
index 0000000..3ebba20
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/opendaylight/yang/gen/v1/org/openecomp/appc/sequencegenerator/impl/rev170706/SequenceGeneratorModuleFactory.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+/*
+* Generated file
+*
+* Generated from: yang module name: sequence-generator-impl yang module local name: sequence-generator-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Thu Aug 10 15:48:17 IST 2017
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.impl.rev170706;
+public class SequenceGeneratorModuleFactory extends org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.impl.rev170706.AbstractSequenceGeneratorModuleFactory {
+
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/SequenceGenerator.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/SequenceGenerator.java
new file mode 100644
index 0000000..0eba668
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/SequenceGenerator.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen;
+
+
+import org.openecomp.appc.dg.objects.VnfcFlowModel;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.objects.SequenceGeneratorInput;
+import org.openecomp.appc.seqgen.objects.Transaction;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Sequence Generator API generates runtime sequence for LCM operations execution
+ */
+public interface SequenceGenerator {
+ /**
+ *
+ * @param input Sequence Generator Input containing request info, vnf capabilites and tunable parameters
+ * @return returns runtime sequence for LCM operation execution
+ * @throws APPCException
+ */
+ List<Transaction> generateSequence(SequenceGeneratorInput input) throws APPCException;
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/SequenceGeneratorPlugin.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/SequenceGeneratorPlugin.java
new file mode 100644
index 0000000..2264751
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/SequenceGeneratorPlugin.java
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.dgplugin;
+
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+import java.util.Map;
+
+public interface SequenceGeneratorPlugin extends SvcLogicJavaPlugin{
+
+ void generateSequence(Map<String,String> params, SvcLogicContext context);
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/impl/SequenceGeneratorPluginImpl.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/impl/SequenceGeneratorPluginImpl.java
new file mode 100644
index 0000000..6671203
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/dgplugin/impl/SequenceGeneratorPluginImpl.java
@@ -0,0 +1,243 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.dgplugin.impl;
+
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.dg.objects.*;
+import org.openecomp.appc.domainmodel.Vnf;
+import org.openecomp.appc.domainmodel.Vnfc;
+import org.openecomp.appc.domainmodel.Vserver;
+import org.openecomp.appc.domainmodel.lcm.VNFOperation;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.SequenceGenerator;
+import org.openecomp.appc.seqgen.dgplugin.SequenceGeneratorPlugin;
+import org.openecomp.appc.seqgen.impl.SequenceGeneratorFactory;
+import org.openecomp.appc.seqgen.objects.Constants;
+import org.openecomp.appc.seqgen.objects.SequenceGeneratorInput;
+import org.openecomp.appc.seqgen.objects.Transaction;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.io.IOException;
+import java.util.*;
+
+public class SequenceGeneratorPluginImpl implements SequenceGeneratorPlugin {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(SequenceGeneratorPluginImpl.class);
+
+ @Override
+ public void generateSequence(Map<String, String> params, SvcLogicContext context) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ String inputJSON = context.getAttribute("inputJSON");
+ logger.debug("Input to Sequence Generator " + inputJSON);
+ try {
+ SequenceGeneratorInput sequenceGeneratorInput = buildSequenceGeneratorInput(inputJSON);
+ List<Transaction> sequence = generateSequence(sequenceGeneratorInput);
+ String output = objectMapper.writeValueAsString(sequence);
+ logger.debug("Sequence Generator Output " + output);
+
+ context.setAttribute("output", output);
+ } catch (Exception e) {
+ logger.error("Error generating sequence", e);
+ context.setAttribute("error-code", "401");
+ context.setAttribute("error-message", "Error generating sequence " + e.getMessage());
+ }
+ }
+
+ private SequenceGeneratorInput buildSequenceGeneratorInput(String inputJson) throws IOException, APPCException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ SequenceGeneratorInput sequenceGeneratorInput ;
+ objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
+ objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+ sequenceGeneratorInput = objectMapper.readValue(inputJson, SequenceGeneratorInput.class);
+
+ InventoryModel inventoryModel = buildInventoryModel(inputJson);
+ sequenceGeneratorInput.setInventoryModel(inventoryModel);
+
+ VnfcDependencyModel dependencyModel = buildDependencyModel(inputJson);
+ sequenceGeneratorInput.setDependencyModel(dependencyModel);
+
+ return sequenceGeneratorInput;
+ }
+ private List<Transaction> generateSequence(SequenceGeneratorInput sequenceGeneratorInput) throws APPCException {
+ if (sequenceGeneratorInput.getRequestInfo() == null) {
+ throw new APPCException("Request info is not provided in the input");
+ }
+ String action = sequenceGeneratorInput.getRequestInfo().getAction();
+ VNFOperation operation = VNFOperation.findByString(action);
+ if (operation == null) {
+ throw new APPCException("Invalid Action " + action);
+ }
+ SequenceGenerator sequenceGenerator = SequenceGeneratorFactory.getInstance().createSequenceGenerator(operation);
+ return sequenceGenerator.generateSequence(sequenceGeneratorInput);
+ }
+
+ // Dependency model is an optional attribute and may contain null values
+ private VnfcDependencyModel buildDependencyModel(String inputJson) throws IOException, APPCException {
+ Set<Node<Vnfc>> dependency = new HashSet<>();
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+ JsonNode rootNode = objectMapper.readTree(inputJson);
+ JsonNode vnfcs = getVnfcsNode(rootNode);
+ if (vnfcs != null) {
+ for (JsonNode vnfcNode : vnfcs) {
+ String vnfcType = readVnfcType(vnfcNode);
+ String mandatory = readMandatory(vnfcNode);
+ String resilience = readResilience(vnfcNode);
+ Vnfc vnfc = new Vnfc(vnfcType, resilience, null, Boolean.parseBoolean(mandatory));
+ Node<Vnfc> currentNode = getNode(dependency, vnfcType);
+ if (currentNode == null) {
+ currentNode = new Node<>(vnfc);
+ dependency.add(currentNode);
+ } else {
+ currentNode.getChild().setMandatory(Boolean.valueOf(mandatory));
+ currentNode.getChild().setResilienceType(resilience);
+ }
+ JsonNode parents = vnfcNode.get("parents");
+ for (JsonNode parent : parents) {
+ String parentVnfcType = parent.asText();
+ Node<Vnfc> parentNode = getNode(dependency, parentVnfcType);
+ if (parentNode != null) {
+ currentNode.addParent(parentNode.getChild());
+ } else {
+ Vnfc parentVnfc = new Vnfc(parentVnfcType, null, null, false);
+ parentNode = new Node<>(parentVnfc);
+ currentNode.addParent(parentVnfc);
+ dependency.add(parentNode);
+ }
+ }
+
+ }
+ return new VnfcDependencyModel(dependency);
+ }
+ return null;
+ }
+
+ private String readResilience(JsonNode vnfcNode) {
+ String resilience = null;
+ if (vnfcNode.get("resilience") != null) {
+ resilience = vnfcNode.get("resilience").asText();
+ }
+ return resilience;
+ }
+
+ private String readMandatory(JsonNode vnfcNode) {
+ String mandatory ;
+ JsonNode mandatoryNode = vnfcNode.get("mandatory");
+ if (mandatoryNode == null) {
+ mandatory = "false";
+ } else {
+ mandatory = mandatoryNode.asText();
+ }
+ return mandatory;
+ }
+
+ private String readVnfcType(JsonNode vnfcNode) throws APPCException {
+ JsonNode vnfcTypeNode = vnfcNode.get(Constants.VNFC_TYPE);
+ if (vnfcTypeNode == null) {
+ throw new APPCException("vnfc-type is not available in dependency info");
+ }
+ return vnfcTypeNode.asText();
+ }
+
+ private JsonNode getVnfcsNode(JsonNode rootNode) {
+ JsonNode dependencyInfo = rootNode.get("dependency-info");
+ JsonNode vnfcs = null;
+ if (dependencyInfo != null) {
+ vnfcs = dependencyInfo.get("vnfcs");
+ }
+ return vnfcs;
+ }
+
+ private Node<Vnfc> getNode(Set<Node<Vnfc>> dependency, String vnfcType) {
+ for (Node<Vnfc> node : dependency) {
+ if (node.getChild().getVnfcType().equals(vnfcType)) {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ private InventoryModel buildInventoryModel(String inputJson) throws IOException, APPCException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
+ JsonNode jsonNode = objectMapper.readTree(inputJson);
+ JsonNode inventoryInfo = jsonNode.get("inventory-info");
+ if (inventoryInfo == null) {
+ throw new APPCException("inventory-info is not provided in the input");
+ }
+ JsonNode vnfInfo = inventoryInfo.get("vnf-info");
+ if (vnfInfo == null) {
+ throw new APPCException("vnf-info is not provided in the input");
+ }
+
+ String vnfId = vnfInfo.get("vnf-id").asText();
+ String vnfType = vnfInfo.get("vnf-type").asText();
+ String vnfVersion = vnfInfo.get("vnf-version").asText();
+
+ Vnf vnf = new Vnf(vnfId, vnfType, vnfVersion);
+
+ JsonNode vms = vnfInfo.get("vm");
+
+ Map<Vnfc, List<Vserver>> vfcs = new HashMap<>();
+ for (JsonNode vm : vms) {
+ if(vm.get("vserver-id")== null){
+ throw new APPCException("vserver-id not found ");
+ }
+ String vserverId = vm.get("vserver-id").asText();
+ Vserver vserver = new Vserver(null, null, vserverId, null, null);
+ JsonNode vnfc = vm.get("vnfc");
+ if (vnfc.get("vnfc-name") == null) {
+ throw new APPCException("vnfc-name not found for vserver " + vserverId);
+ }
+ String vnfcName = vnfc.get("vnfc-name").asText();
+ if (vnfc.get("vnfc-type") == null) {
+ throw new APPCException("vnfc-type not found for vserver " + vserverId);
+ }
+ String vnfcType = vnfc.get("vnfc-type").asText();
+ if (StringUtils.isEmpty(vnfcType)) {
+ throw new APPCException("vserver " + vserverId + " is not associated with any vnfc");
+ }
+ Vnfc vfc = new Vnfc(vnfcType, null, vnfcName);
+ List<Vserver> vServers = vfcs.get(vfc);
+ if (vServers == null) {
+ vServers = new LinkedList<>();
+ vfcs.put(vfc, vServers);
+ }
+ vServers.add(vserver);
+ }
+
+ for (Map.Entry<Vnfc, List<Vserver>> entry : vfcs.entrySet()) {
+ Vnfc vnfc = entry.getKey();
+ List<Vserver> vServers = vfcs.get(vnfc);
+ vnfc.addVms(vServers);
+ vnf.addVnfc(vnfc);
+ }
+
+ return new InventoryModel(vnf);
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/SequenceGeneratorFactory.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/SequenceGeneratorFactory.java
new file mode 100644
index 0000000..5d41fff
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/SequenceGeneratorFactory.java
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.impl;
+
+import org.openecomp.appc.domainmodel.lcm.VNFOperation;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.SequenceGenerator;
+
+public class SequenceGeneratorFactory {
+
+ private static class ReferenceHolder {
+ private static SequenceGeneratorFactory instance = new SequenceGeneratorFactory();
+ private ReferenceHolder(){
+
+ }
+ }
+
+ private SequenceGeneratorFactory(){
+
+ }
+
+ public static SequenceGeneratorFactory getInstance(){
+ return ReferenceHolder.instance;
+ }
+
+ public SequenceGenerator createSequenceGenerator(VNFOperation operation) throws APPCException {
+ switch (operation){
+ case Start:
+ return new StartSequenceGenerator();
+ case Stop:
+ return new StopSequenceGenerator();
+ default:
+ throw new APPCException("Sequence Generator does not support operation " + operation.name());
+ }
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StartSequenceGenerator.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StartSequenceGenerator.java
new file mode 100644
index 0000000..acdeddd
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StartSequenceGenerator.java
@@ -0,0 +1,291 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.impl;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.dg.flowbuilder.FlowBuilder;
+import org.openecomp.appc.dg.flowbuilder.impl.FlowBuilderFactory;
+import org.openecomp.appc.dg.objects.FlowStrategies;
+import org.openecomp.appc.dg.objects.InventoryModel;
+import org.openecomp.appc.dg.objects.VnfcDependencyModel;
+import org.openecomp.appc.dg.objects.VnfcFlowModel;
+import org.openecomp.appc.domainmodel.Vnfc;
+import org.openecomp.appc.domainmodel.Vserver;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.SequenceGenerator;
+import org.openecomp.appc.seqgen.objects.*;
+
+import java.util.*;
+
+import static org.openecomp.appc.seqgen.objects.Constants.*;
+
+public class StartSequenceGenerator implements SequenceGenerator {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(StartSequenceGenerator.class);
+
+ private List<Transaction> generateSequenceWithOutDependency(SequenceGeneratorInput input) throws APPCException {
+
+ List<Transaction> transactionList = new LinkedList<>();
+ Integer transactionId = 1;
+ List<Vnfc> invVnfcList = input.getInventoryModel().getVnf().getVnfcs();
+ boolean singleTransaction=checkSingleTransaction(invVnfcList);
+ for (Vnfc vnfc : invVnfcList) {
+ List<Vserver> vms = vnfc.getVserverList();
+ List<Integer> transactionIds = new LinkedList<>();
+ for (Vserver vm : vms) {
+ Transaction transaction = new Transaction();
+ transaction.setTransactionId(transactionId);
+ transactionIds.add(transactionId++);
+ transaction.setAction(Action.START.getActionType());
+ transaction.setActionLevel(ActionLevel.VM.getAction());
+ ActionIdentifier actionIdentifier = new ActionIdentifier();
+ actionIdentifier.setvServerId(vm.getId());
+ transaction.setActionIdentifier(actionIdentifier);
+ transaction.setPayload(input.getRequestInfo().getPayload());
+ if(!singleTransaction){
+ updateResponse(transaction);
+ }
+
+ transactionList.add(transaction);
+ }
+ }
+ return transactionList;
+ }
+
+ private boolean checkSingleTransaction(List<Vnfc> invVnfcList) {
+ int vServerCount=0;
+ for(Vnfc vnfc : invVnfcList) {
+ List<Vserver> vms = vnfc.getVserverList();
+ vServerCount=vServerCount+vms.size();
+ }
+ return vServerCount <= 1;
+ }
+
+ private void updateResponse(Transaction transaction) {
+ Response ignoreResponse = new Response();
+ ignoreResponse.setResponseMessage(ResponseMessage.FAILURE.getResponse());
+ Map<String, String> ignoreAction = new HashMap<>();
+ ignoreAction.put(ResponseAction.IGNORE.getAction(), Boolean.TRUE.toString());
+ ignoreResponse.setResponseAction(ignoreAction);
+ transaction.addResponse(ignoreResponse);
+ }
+
+ private List<Transaction> generateSequenceWithDependencyModel(VnfcFlowModel flowModel, SequenceGeneratorInput input) throws APPCException {
+ Integer waitTime = readWaitTime(input);
+ Integer retryCount = readRetryCount(input);
+ List<Transaction> transactionList = new LinkedList<>();
+ Integer transactionId = 1;
+ Iterator<List<Vnfc>> itr = flowModel.getModelIterator();
+ while (itr.hasNext()) {
+ List<Vnfc> vnfcs = itr.next();
+ for (Vnfc vnfc : vnfcs) {
+ List<Vserver> vms = vnfc.getVserverList();
+ List<Integer> transactionIds = new LinkedList<>();
+ transactionId = updateTransactions(input, transactionList, transactionId, vms, transactionIds);
+
+ boolean startApplicationSupported = readApplicationStartCapability(input);
+ transactionId = checkAndUpdateStartApplication(input, transactionList, transactionId, vnfc, transactionIds, startApplicationSupported);
+
+ boolean healthCheckSupported = readHealthCheckCapabilites(input.getCapability());
+ transactionId = checkAndUpdateHealthCheck(input, waitTime, retryCount, transactionList, transactionId, vnfc, healthCheckSupported);
+ }
+ }
+ return transactionList;
+ }
+
+ private Integer checkAndUpdateHealthCheck(SequenceGeneratorInput input, Integer waitTime, Integer retryCount, List<Transaction> transactionList, Integer transactionId, Vnfc vnfc, boolean healthCheckSupported) {
+ if (healthCheckSupported) {
+ Transaction healthCheckTransaction = new Transaction();
+ healthCheckTransaction.setTransactionId(transactionId++);
+ healthCheckTransaction.setAction(Action.HEALTH_CHECK.getActionType());
+ healthCheckTransaction.setActionLevel(ActionLevel.VNFC.getAction());
+ ActionIdentifier healthCheckActionIdentifier = new ActionIdentifier();
+ healthCheckActionIdentifier.setVnfcName(vnfc.getVnfcName());
+ healthCheckTransaction.setActionIdentifier(healthCheckActionIdentifier);
+ healthCheckTransaction.setPayload(input.getRequestInfo().getPayload());
+
+ Response retryResponse = new Response();
+ retryResponse.setResponseMessage(ResponseMessage.UNHEALTHY.getResponse());
+ Map<String, String> retryAction = new HashMap<>();
+ retryAction.put(ResponseAction.RETRY.getAction(), retryCount.toString());
+ retryAction.put(ResponseAction.WAIT.getAction(), waitTime.toString());
+ retryResponse.setResponseAction(retryAction);
+ healthCheckTransaction.addResponse(retryResponse);
+
+ Response healthyResponse = new Response();
+ healthyResponse.setResponseMessage(ResponseMessage.HEALTHY.getResponse());
+ Map<String, String> healthyAction = new HashMap<>();
+ healthyAction.put(ResponseAction.CONTINUE.getAction().toLowerCase(), Boolean.TRUE.toString());
+ healthyResponse.setResponseAction(healthyAction);
+ healthCheckTransaction.addResponse(healthyResponse);
+
+ Response failureResponse = new Response();
+ failureResponse.setResponseMessage(ResponseMessage.FAILURE.getResponse());
+ Map<String, String> failureResonseAction = new HashMap<>();
+ failureResonseAction.put(ResponseAction.STOP.getAction(), Boolean.TRUE.toString());
+ failureResponse.setResponseAction(failureResonseAction);
+ healthCheckTransaction.addResponse(failureResponse);
+ transactionList.add(healthCheckTransaction);
+ }
+ return transactionId;
+ }
+
+ private Integer checkAndUpdateStartApplication(SequenceGeneratorInput input, List<Transaction> transactionList, Integer transactionId, Vnfc vnfc, List<Integer> transactionIds, boolean startApplicationSupported) {
+ if (startApplicationSupported) {
+ Transaction startAppTransaction = new Transaction();
+ startAppTransaction.setTransactionId(transactionId++);
+ startAppTransaction.setAction(Action.START_APPLICATION.getActionType());
+ startAppTransaction.setActionLevel(ActionLevel.VNFC.getAction());
+ ActionIdentifier startActionIdentifier = new ActionIdentifier();
+ startActionIdentifier.setVnfcName(vnfc.getVnfcName());
+ startAppTransaction.setActionIdentifier(startActionIdentifier);
+ startAppTransaction.setPayload(input.getRequestInfo().getPayload());
+
+ List<PreCheckOption> preCheckOptions = new LinkedList<>();
+ for (Integer vmTransactionId : transactionIds) {
+ setPreCheckOptions(preCheckOptions, vmTransactionId);
+ }
+ startAppTransaction.setPreCheckOperator(PreCheckOperator.ANY.getOperator());
+ startAppTransaction.setPrecheckOptions(preCheckOptions);
+ transactionList.add(startAppTransaction);
+ }
+ return transactionId;
+ }
+
+ private Integer updateTransactions(SequenceGeneratorInput input, List<Transaction> transactionList, Integer transactionId, List<Vserver> vms, List<Integer> transactionIds) {
+ for (Vserver vm : vms) {
+ Transaction transaction = new Transaction();
+ transaction.setTransactionId(transactionId);
+ transactionIds.add(transactionId++);
+ transaction.setAction(Action.START.getActionType());
+ transaction.setActionLevel(ActionLevel.VM.getAction());
+ ActionIdentifier actionIdentifier = new ActionIdentifier();
+ actionIdentifier.setvServerId(vm.getId());
+ transaction.setActionIdentifier(actionIdentifier);
+ transaction.setPayload(input.getRequestInfo().getPayload());
+
+ updateResponse(transaction);
+ transactionList.add(transaction);
+ }
+ return transactionId;
+ }
+
+ private void setPreCheckOptions(List<PreCheckOption> preCheckOptions, Integer vmTransactionId) {
+ PreCheckOption option = new PreCheckOption();
+ option.setPreTransactionId(vmTransactionId);
+ option.setParamName("status");
+ option.setParamValue("success");
+ preCheckOptions.add(option);
+ }
+
+ @Override
+ public List<Transaction> generateSequence(SequenceGeneratorInput input) throws APPCException {
+ if(input.getRequestInfo().getActionLevel().equals(ActionLevel.VM.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VNFC.getAction())||
+ input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VF_MODULE.getAction())) {
+ if (input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction()) && input.getDependencyModel() != null) {
+ FlowStrategies flowStrategy = readStartFlowStrategy(input);
+ VnfcFlowModel flowModel = buildFlowModel(input.getInventoryModel()
+ , input.getDependencyModel(), flowStrategy);
+ logger.debug("Flow Model " + flowModel);
+ return generateSequenceWithDependencyModel(flowModel, input);
+ } else {
+ logger.info("Generating sequence without dependency model");
+ return generateSequenceWithOutDependency(input);
+ }
+ }throw new APPCException("Invalid action level "+input.getRequestInfo().getActionLevel());
+ }
+
+ private VnfcFlowModel buildFlowModel(InventoryModel inventoryModel, VnfcDependencyModel dependencyModel, FlowStrategies flowStrategy) throws APPCException {
+ FlowBuilder flowBuilder = FlowBuilderFactory.getInstance().getFlowBuilder(flowStrategy);
+ if (flowBuilder == null) {
+ throw new APPCException("Flow Strategy not supported " + flowStrategy);
+ }
+ return flowBuilder.buildFlowModel(dependencyModel, inventoryModel);
+ }
+
+ private FlowStrategies readStartFlowStrategy(SequenceGeneratorInput sequenceGeneratorInput) throws APPCException {
+ Map<String, String> tunableParams = sequenceGeneratorInput.getTunableParams();
+ FlowStrategies strategy;
+ String strategyStr = null;
+ if (tunableParams != null) {
+ strategyStr = tunableParams.get(Constants.STRATEGY);
+ if (StringUtils.isBlank(strategyStr)) {
+ return FlowStrategies.FORWARD;
+ }
+
+ strategy = FlowStrategies.findByString(strategyStr);
+ if (strategy != null) {
+ return strategy;
+ }
+ }
+ throw new APPCException("Invalid Strategy " + strategyStr);
+ }
+
+ private boolean readHealthCheckCapabilites(Map<String, List<String>> capabilities) {
+ if (capabilities != null) {
+ List<String> vnfcCapabilities = capabilities.get(CapabilityLevel.VNFC.getLevel());
+ if (vnfcCapabilities != null)
+ return vnfcCapabilities.stream()
+ .anyMatch(p -> Capabilties.HEALTH_CHECK.getCapability().equalsIgnoreCase(p));
+ }
+ return false;
+ }
+
+ private boolean readApplicationStartCapability(SequenceGeneratorInput input) {
+ Map<String, List<String>> capability = input.getCapability();
+ if (capability != null) {
+ List<String> vnfcCapabilities = capability.get(CapabilityLevel.VNFC.getLevel());
+ if (vnfcCapabilities != null)
+ return vnfcCapabilities.stream().anyMatch(p -> Capabilties.START_APPLICATION.getCapability().equalsIgnoreCase(p));
+ }
+ return false;
+ }
+
+ private Integer readRetryCount(SequenceGeneratorInput input) throws APPCException {
+ String paramValStr = input.getTunableParams().get(RETRY_COUNT);
+ if (StringUtils.isEmpty(paramValStr)) {
+ return RETRY_COUNT_VALUE;
+ }
+ try {
+ return Integer.parseInt(paramValStr);
+ } catch (NumberFormatException e) {
+ String message = "Invalid Number for Retry Count " + paramValStr;
+ logger.error(message, e);
+ throw new APPCException(message);
+ }
+ }
+
+ private Integer readWaitTime(SequenceGeneratorInput input) throws APPCException {
+ String paramValStr = input.getTunableParams().get(WAIT_TIME);
+ if (StringUtils.isEmpty(paramValStr)) {
+ return WAIT_TIME_VALUE;
+ }
+ try {
+ return Integer.parseInt(paramValStr);
+ } catch (NumberFormatException e) {
+ String message = "Invalid Number for Wait Time " + paramValStr;
+ logger.error(message, e);
+ throw new APPCException(message);
+ }
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StopSequenceGenerator.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StopSequenceGenerator.java
new file mode 100644
index 0000000..6dec0e6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/impl/StopSequenceGenerator.java
@@ -0,0 +1,183 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.impl;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.dg.flowbuilder.FlowBuilder;
+import org.openecomp.appc.dg.flowbuilder.impl.FlowBuilderFactory;
+import org.openecomp.appc.dg.objects.FlowStrategies;
+import org.openecomp.appc.dg.objects.InventoryModel;
+import org.openecomp.appc.dg.objects.VnfcDependencyModel;
+import org.openecomp.appc.dg.objects.VnfcFlowModel;
+import org.openecomp.appc.domainmodel.Vnfc;
+import org.openecomp.appc.domainmodel.Vserver;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.SequenceGenerator;
+import org.openecomp.appc.seqgen.objects.*;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.util.*;
+
+import static org.openecomp.appc.seqgen.objects.Constants.*;
+
+public class StopSequenceGenerator implements SequenceGenerator {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(StartSequenceGenerator.class);
+
+ @Override
+ public List<Transaction> generateSequence(SequenceGeneratorInput input) throws APPCException {
+ if(input.getRequestInfo().getActionLevel().equals(ActionLevel.VM.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VNFC.getAction())||
+ input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction())||input.getRequestInfo().getActionLevel().equals(ActionLevel.VF_MODULE.getAction())) {
+ if (input.getRequestInfo().getActionLevel().equals(ActionLevel.VNF.getAction()) && input.getDependencyModel() != null) {
+ FlowStrategies flowStrategy = readStopFlowStrategy(input);
+ VnfcFlowModel flowModel = buildFlowModel(input.getInventoryModel()
+ , input.getDependencyModel(), flowStrategy);
+ logger.debug("Flow Model " + flowModel);
+ return generateSequenceWithDependencyModel(flowModel, input);
+ } else {
+ logger.info("Generating sequence without dependency model");
+ return generateSequenceWithOutDependency(input);
+ }
+ }throw new APPCException("Invalid action level "+input.getRequestInfo().getActionLevel());
+
+ }
+ private List<Transaction> generateSequenceWithOutDependency(SequenceGeneratorInput input){
+ List<Transaction> transactionList = new LinkedList<>();
+ Integer transactionId = 1;
+ List<Integer> transactionIds = new LinkedList<>();
+ List<Vnfc> invVnfcList = input.getInventoryModel().getVnf().getVnfcs();
+ boolean singleTransaction=checkSingleTransaction(invVnfcList);
+ for (Vnfc vnfc : invVnfcList) {
+ List<Vserver> vms = vnfc.getVserverList();
+ for(Vserver vm:vms){
+ Transaction transaction = new Transaction();
+ transaction.setTransactionId(transactionId);
+ transactionIds.add(transactionId++);
+ transaction.setAction(Action.STOP.getActionType());
+ transaction.setActionLevel(ActionLevel.VM.getAction());
+ ActionIdentifier actionIdentifier = new ActionIdentifier();
+ actionIdentifier.setvServerId(vm.getId());
+ transaction.setActionIdentifier(actionIdentifier);
+ transaction.setPayload(input.getRequestInfo().getPayload());
+ if(!singleTransaction){
+ updateStopResponse(transaction);
+ }
+ transactionList.add(transaction);
+ }
+ }
+ return transactionList;
+ }
+
+ private void updateStopResponse(Transaction transaction) {
+ Response failureResponse = new Response();
+ failureResponse.setResponseMessage(ResponseMessage.FAILURE.getResponse());
+ Map<String,String> failureAction = new HashMap<>();
+ failureAction.put(ResponseAction.IGNORE.getAction(),Boolean.TRUE.toString());
+ failureResponse.setResponseAction(failureAction);
+ transaction.addResponse(failureResponse);
+ }
+ private boolean checkSingleTransaction(List<Vnfc> invVnfcList) {
+ int vServerCount=0;
+ for(Vnfc vnfc : invVnfcList) {
+ List<Vserver> vms = vnfc.getVserverList();
+ vServerCount=vServerCount+vms.size();
+ }
+ return vServerCount <= 1;
+ }
+
+ private List<Transaction> generateSequenceWithDependencyModel(VnfcFlowModel flowModel,SequenceGeneratorInput input){
+ List<Transaction> transactionList = new LinkedList<>();
+ Integer transactionId = 1;
+ List<Integer> transactionIds = new LinkedList<>();
+ Iterator<List<Vnfc>> itr = flowModel.getModelIterator();
+ while (itr.hasNext()){
+ List<Vnfc> vnfcs = itr.next();
+ for(Vnfc vnfc:vnfcs){
+ boolean stopApplicationSupported = readApplicationStopCapability(input);
+ if(stopApplicationSupported){
+ Transaction stopAppTransaction = new Transaction();
+ stopAppTransaction.setTransactionId(transactionId++);
+ stopAppTransaction.setAction(Action.STOP_APPLICATION.getActionType());
+ stopAppTransaction.setActionLevel(ActionLevel.VNFC.getAction());
+ ActionIdentifier stopActionIdentifier = new ActionIdentifier();
+ stopActionIdentifier .setVnfcName(vnfc.getVnfcName());
+ stopAppTransaction.setActionIdentifier(stopActionIdentifier );
+ stopAppTransaction.setPayload(input.getRequestInfo().getPayload());
+ updateStopResponse(stopAppTransaction);
+ transactionList.add(stopAppTransaction);
+ }
+ List<Vserver> vms = vnfc.getVserverList();
+ for(Vserver vm:vms){
+ Transaction transaction = new Transaction();
+ transaction.setTransactionId(transactionId);
+ transactionIds.add(transactionId++);
+ transaction.setAction(Action.STOP.getActionType());
+ transaction.setActionLevel(ActionLevel.VM.getAction());
+ ActionIdentifier actionIdentifier = new ActionIdentifier();
+ actionIdentifier.setvServerId(vm.getId());
+ transaction.setActionIdentifier(actionIdentifier);
+ transaction.setPayload(input.getRequestInfo().getPayload());
+
+ updateStopResponse(transaction);
+ transactionList.add(transaction);
+ }
+ }
+ }
+ return transactionList;
+ }
+
+ private VnfcFlowModel buildFlowModel(InventoryModel inventoryModel, VnfcDependencyModel dependencyModel, FlowStrategies flowStrategy) throws APPCException {
+ FlowBuilder flowBuilder = FlowBuilderFactory.getInstance().getFlowBuilder(flowStrategy);
+ if (flowBuilder == null) {
+ throw new APPCException("Flow Strategy not supported " + flowStrategy);
+ }
+ return flowBuilder.buildFlowModel(dependencyModel, inventoryModel);
+ }
+
+ private FlowStrategies readStopFlowStrategy(SequenceGeneratorInput sequenceGeneratorInput) throws APPCException {
+ Map<String, String> tunableParams = sequenceGeneratorInput.getTunableParams();
+ FlowStrategies strategy;
+ String strategyStr = null;
+ if (tunableParams != null) {
+ strategyStr = tunableParams.get(Constants.STRATEGY);
+ if (StringUtils.isBlank(strategyStr)) {
+ return FlowStrategies.REVERSE;
+ }
+ strategy = FlowStrategies.findByString(strategyStr);
+ if (strategy != null) {
+ return strategy;
+ }
+ }
+ throw new APPCException("Invalid Strategy " + strategyStr);
+ }
+ private boolean readApplicationStopCapability(SequenceGeneratorInput input) {
+ Map<String,List<String>> capability = input.getCapability();
+ if(capability!= null){
+ List<String> vnfcCapabilities = capability.get(Constants.CapabilityLevel.VNFC.getLevel());
+ if(vnfcCapabilities!=null)
+ return vnfcCapabilities.stream().anyMatch(p -> Capabilties.STOP_APPLICATION.getCapability().equalsIgnoreCase(p));
+ }
+ return false;
+ }
+
+
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/ActionIdentifier.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/ActionIdentifier.java
new file mode 100644
index 0000000..ae3ed94
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/ActionIdentifier.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ActionIdentifier {
+
+ @JsonProperty("vnf-id")
+ private String vnfId;
+
+ @JsonProperty("vnfc-name")
+ private String vnfcName;
+
+ @JsonProperty("vserver-id")
+ private String vServerId;
+
+ public String getVnfId() {
+ return vnfId;
+ }
+
+ public void setVnfId(String vnfId) {
+ this.vnfId = vnfId;
+ }
+
+ public String getVnfcName() {
+ return vnfcName;
+ }
+
+ public void setVnfcName(String vnfcName) {
+ this.vnfcName = vnfcName;
+ }
+
+ public String getvServerId() {
+ return vServerId;
+ }
+
+ public void setvServerId(String vServerId) {
+ this.vServerId = vServerId;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Constants.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Constants.java
new file mode 100644
index 0000000..354145f
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Constants.java
@@ -0,0 +1,123 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+public class Constants {
+ public static final String RETRY_COUNT = "retry-count";
+ public static final String WAIT_TIME = "wait-time";
+ public static final Integer WAIT_TIME_VALUE = 60;
+ public static final Integer RETRY_COUNT_VALUE = 4;
+ public static final String STRATEGY = "strategy";
+ public static final String VNFC_TYPE = "vnfc-type";
+
+ public enum CapabilityLevel{
+ VNF("vnf"),VNFC("vnfc"),VM("vm");
+ private String level;
+ CapabilityLevel(String level) {
+ this.level=level;
+ }
+
+ public String getLevel() {
+ return level;
+ }
+ }
+
+ public enum Capabilties{
+ START_APPLICATION("StartApplication"),HEALTH_CHECK("HealthCheck"),STOP_APPLICATION("StopApplication");
+ private String capability;
+
+ Capabilties(String capability) {
+ this.capability=capability;
+ }
+ public String getCapability(){
+ return capability;
+ }
+ }
+
+ public enum ResponseMessage{
+ HEALTHY("healthy"),UNHEALTHY("unhealthy"),SUCCESS("success"),FAILURE("failure");
+
+ public String getResponse() {
+ return response;
+ }
+
+ private String response;
+ ResponseMessage(String response){
+ this.response=response;
+ }
+
+ }
+
+ public enum ResponseAction{
+ STOP("stop"),RETRY("retry"),IGNORE("ignore"),WAIT("wait"),CONTINUE("Continue");
+
+ ResponseAction(String action) {
+ this.action=action;
+ }
+
+ private String action;
+
+ public String getAction() {
+ return action;
+ }
+
+ }
+
+ public enum Action{
+ START("Start"),START_APPLICATION("StartApplication"),HEALTH_CHECK("HealthCheck"),STOP_APPLICATION("StopApplication"),STOP("Stop");
+
+ Action(String actionType) {
+ this.actionType=actionType;
+ }
+
+ public String getActionType() {
+ return actionType;
+ }
+
+ private String actionType;
+
+ }
+ public enum ActionLevel{
+ VM("vm"),VNFC("vnfc"),VNF("vnf"),VF_MODULE("vf-module");
+ private String action;
+ ActionLevel(String action){
+ this.action=action;
+ }
+ public String getAction() {
+ return action;
+ }
+ }
+
+ public enum PreCheckOperator{
+ ANY("any"),ALL("all");
+
+ PreCheckOperator(String operator){
+ this.operator=operator;
+ }
+
+ public String getOperator() {
+ return operator;
+ }
+
+ private String operator;
+
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/PreCheckOption.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/PreCheckOption.java
new file mode 100644
index 0000000..860fac7
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/PreCheckOption.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class PreCheckOption {
+
+ @JsonProperty("pre-transactionID")
+ private Integer preTransactionId;
+
+ @JsonProperty("param-name")
+ private String paramName;
+
+ @JsonProperty("param-value")
+ private String paramValue;
+
+ private String rule;
+
+
+ public Integer getPreTransactionId() {
+ return preTransactionId;
+ }
+
+ public void setPreTransactionId(Integer preTransactionId) {
+ this.preTransactionId = preTransactionId;
+ }
+
+ public String getParamName() {
+ return paramName;
+ }
+
+ public void setParamName(String paramName) {
+ this.paramName = paramName;
+ }
+
+ public String getParamValue() {
+ return paramValue;
+ }
+
+ public void setParamValue(String paramValue) {
+ this.paramValue = paramValue;
+ }
+
+ public String getRule() {
+ return rule;
+ }
+
+ public void setRule(String rule) {
+ this.rule = rule;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfo.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfo.java
new file mode 100644
index 0000000..697e13e
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfo.java
@@ -0,0 +1,72 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class RequestInfo {
+
+ private String action;
+
+ @JsonProperty("action-level")
+ private String actionLevel;
+
+ @JsonProperty("action-identifier")
+ private ActionIdentifier actionIdentifier;
+
+ private String payload;
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+ public String getActionLevel() {
+ return actionLevel;
+ }
+
+ public void setActionLevel(String actionLevel) {
+ this.actionLevel = actionLevel;
+ }
+
+ public ActionIdentifier getActionIdentifier() {
+ return actionIdentifier;
+ }
+
+ public void setActionIdentifier(ActionIdentifier actionIdentifier) {
+ this.actionIdentifier = actionIdentifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfoBuilder.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfoBuilder.java
new file mode 100644
index 0000000..70d4e9a
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/RequestInfoBuilder.java
@@ -0,0 +1,76 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+public class RequestInfoBuilder {
+
+ private String action;
+
+ private String actionLevel;
+
+ private ActionIdentifier actionIdentifier;
+
+ private String payload;
+
+ public RequestInfoBuilder actionIdentifier(){
+ this.actionIdentifier = new ActionIdentifier();
+ return this;
+ }
+
+ public RequestInfoBuilder vnfId(String vnfId){
+ this.actionIdentifier.setVnfId(vnfId);
+ return this;
+ }
+
+ public RequestInfoBuilder vnfcName(String vnfcName){
+ this.actionIdentifier.setVnfcName(vnfcName);
+ return this;
+ }
+
+ public RequestInfoBuilder vServerId(String vServerId){
+ this.actionIdentifier.setvServerId(vServerId);
+ return this;
+ }
+
+ public RequestInfoBuilder action(String action){
+ this.action = action;
+ return this;
+ }
+
+ public RequestInfoBuilder actionLevel(String actionLevel){
+ this.actionLevel = actionLevel;
+ return this;
+ }
+
+ public RequestInfoBuilder payload(String payload){
+ this.payload = payload;
+ return this;
+ }
+
+ public RequestInfo build(){
+ RequestInfo requestInfo = new RequestInfo();
+ requestInfo.setAction(this.action);
+ requestInfo.setActionIdentifier(this.actionIdentifier);
+ requestInfo.setActionLevel(this.actionLevel);
+ requestInfo.setPayload(this.payload);
+ return requestInfo;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Response.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Response.java
new file mode 100644
index 0000000..9247e6e
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Response.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.util.Map;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Response {
+
+ @JsonProperty("response-code")
+ private String responseCode;
+
+ @JsonProperty("response-message")
+ private String responseMessage;
+
+ @JsonProperty("response-action")
+ private Map<String,String> responseAction;
+
+ public String getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(String responseCode) {
+ this.responseCode = responseCode;
+ }
+
+ public String getResponseMessage() {
+ return responseMessage;
+ }
+
+ public void setResponseMessage(String responseMessage) {
+ this.responseMessage = responseMessage;
+ }
+
+ public Map<String, String> getResponseAction() {
+ return responseAction;
+ }
+
+ public void setResponseAction(Map<String, String> responseAction) {
+ this.responseAction = responseAction;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInput.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInput.java
new file mode 100644
index 0000000..851a075
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInput.java
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import org.openecomp.appc.dg.objects.InventoryModel;
+import org.openecomp.appc.dg.objects.VnfcDependencyModel;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Map;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class SequenceGeneratorInput {
+
+ @NotNull
+ @JsonProperty("request-info")
+ private RequestInfo requestInfo;
+
+ @JsonIgnore
+ private InventoryModel inventoryModel;
+
+ @JsonIgnore
+ private VnfcDependencyModel dependencyModel;
+
+ @JsonProperty("tunable-parameters")
+ private Map<String,String> tunableParams;
+
+ @JsonProperty("capabilities")
+ private Map<String,List<String>> capability;
+
+ public RequestInfo getRequestInfo() {
+ return requestInfo;
+ }
+
+ public void setRequestInfo(RequestInfo requestInfo) {
+ this.requestInfo = requestInfo;
+ }
+
+ public InventoryModel getInventoryModel() {
+ return inventoryModel;
+ }
+
+ public void setInventoryModel(InventoryModel inventoryModel) {
+ this.inventoryModel = inventoryModel;
+ }
+
+ public VnfcDependencyModel getDependencyModel() {
+ return dependencyModel;
+ }
+
+ public void setDependencyModel(VnfcDependencyModel dependencyModel) {
+ this.dependencyModel = dependencyModel;
+ }
+
+ public Map<String, String> getTunableParams() {
+ return tunableParams;
+ }
+
+ public void setTunableParams(Map<String, String> tunableParams) {
+ this.tunableParams = tunableParams;
+ }
+
+ public Map<String, List<String>> getCapability() {
+ return capability;
+ }
+
+ public void setCapability(Map<String, List<String>> capability) {
+ this.capability = capability;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInputBuilder.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInputBuilder.java
new file mode 100644
index 0000000..b72e46e
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/SequenceGeneratorInputBuilder.java
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import org.openecomp.appc.dg.objects.InventoryModel;
+import org.openecomp.appc.dg.objects.VnfcDependencyModel;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SequenceGeneratorInputBuilder {
+
+ private RequestInfo requestInfo;
+
+ private InventoryModel inventoryModel;
+
+ private VnfcDependencyModel dependencyModel;
+
+ private Map<String,String> tunableParams;
+
+ private Map<String,List<String>> capability;
+
+ public SequenceGeneratorInputBuilder requestInfo(RequestInfo requestInfo){
+ this.requestInfo = requestInfo;
+ return this;
+ }
+
+ public SequenceGeneratorInputBuilder capability(String level,List<String> capabilities){
+ if(this.capability ==null){
+ this.capability = new HashMap<>();
+ }
+ this.capability.put(level,capabilities);
+ return this;
+ }
+
+ public SequenceGeneratorInputBuilder tunableParameter(String key,String value){
+ if(this.tunableParams ==null){
+ this.tunableParams = new HashMap<>();
+ }
+ this.tunableParams.put(key,value);
+ return this;
+ }
+
+ public SequenceGeneratorInputBuilder inventoryModel(InventoryModel model){
+ this.inventoryModel = model;
+ return this;
+ }
+
+ public SequenceGeneratorInputBuilder dependendcyModel(VnfcDependencyModel model){
+ this.dependencyModel = model;
+ return this;
+ }
+
+ public SequenceGeneratorInput build(){
+ SequenceGeneratorInput input = new SequenceGeneratorInput();
+ input.setRequestInfo(this.requestInfo);
+ input.setCapability(this.capability);
+ input.setInventoryModel(this.inventoryModel);
+ input.setDependencyModel(this.dependencyModel);
+ input.setTunableParams(this.tunableParams);
+ return input;
+ }
+
+
+
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Transaction.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Transaction.java
new file mode 100644
index 0000000..b49d132
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/objects/Transaction.java
@@ -0,0 +1,142 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.objects;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class Transaction {
+
+ @JsonProperty("transactionId")
+ private Integer transactionId;
+
+ @JsonProperty("action")
+ private String action;
+
+ @JsonProperty("action-level")
+ private String actionLevel;
+
+ @JsonProperty("action-identifier")
+ private ActionIdentifier actionIdentifier;
+
+ @JsonProperty("payload")
+ private String payload;
+
+ @JsonProperty("parameters")
+ private Map<String,String> parameters;
+
+ @JsonProperty("precheck-operator")
+ private String preCheckOperator;
+
+
+ @JsonProperty("precheck-options")
+ private List<PreCheckOption> precheckOptions;
+
+ @JsonProperty("responses")
+ private List<Response> responses;
+
+ public Transaction(){
+ responses = new LinkedList<>();
+ }
+
+ public Integer getTransactionId() {
+ return transactionId;
+ }
+
+ public void setTransactionId(Integer transactionId) {
+ this.transactionId = transactionId;
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+ public String getActionLevel() {
+ return actionLevel;
+ }
+
+ public void setActionLevel(String actionLevel) {
+ this.actionLevel = actionLevel;
+ }
+
+ public ActionIdentifier getActionIdentifier() {
+ return actionIdentifier;
+ }
+
+ public void setActionIdentifier(ActionIdentifier actionIdentifier) {
+ this.actionIdentifier = actionIdentifier;
+ }
+
+ public String getPayload() {
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = payload;
+ }
+
+ public Map<String, String> getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(Map<String, String> parameters) {
+ this.parameters = parameters;
+ }
+
+ public List<Response> getResponses() {
+ return responses;
+ }
+
+ public void setResponses(List<Response> responses) {
+ this.responses = responses;
+ }
+
+ public void addResponse(Response response){
+ this.responses.add(response);
+ }
+
+ public String getPreCheckOperator() {
+ return preCheckOperator;
+ }
+
+ public void setPreCheckOperator(String preCheckOperator) {
+ this.preCheckOperator = preCheckOperator;
+ }
+
+ public List<PreCheckOption> getPrecheckOptions() {
+ return precheckOptions;
+ }
+
+ public void setPrecheckOptions(List<PreCheckOption> precheckOptions) {
+ this.precheckOptions = precheckOptions;
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/provider/SequenceGeneratorProvider.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/provider/SequenceGeneratorProvider.java
new file mode 100644
index 0000000..b3aab54
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/java/org/openecomp/appc/seqgen/provider/SequenceGeneratorProvider.java
@@ -0,0 +1,352 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen.provider;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.google.common.util.concurrent.Futures;
+import org.apache.commons.lang.StringUtils;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.GenerateSequenceInput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.GenerateSequenceOutput;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.GenerateSequenceOutputBuilder;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.SequenceGeneratorService;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.dependency.info.dependency.info.Vnfcs;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.inventory.info.inventory.info.vnf.info.Vm;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.StatusBuilder;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.Transactions;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.TransactionsBuilder;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.transactions.ActionIdentifier;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.transactions.*;
+import org.opendaylight.yang.gen.v1.org.openecomp.appc.sequencegenerator.rev170706.response.transactions.responses.ResponseActionBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.openecomp.appc.dg.objects.InventoryModel;
+import org.openecomp.appc.dg.objects.Node;
+import org.openecomp.appc.dg.objects.VnfcDependencyModel;
+import org.openecomp.appc.domainmodel.Vnf;
+import org.openecomp.appc.domainmodel.Vserver;
+import org.openecomp.appc.domainmodel.lcm.VNFOperation;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.seqgen.SequenceGenerator;
+import org.openecomp.appc.seqgen.impl.SequenceGeneratorFactory;
+import org.openecomp.appc.seqgen.objects.*;
+
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+
+public class SequenceGeneratorProvider implements AutoCloseable,SequenceGeneratorService{
+ protected DataBroker dataBroker;
+ protected RpcProviderRegistry rpcRegistry;
+ protected NotificationProviderService notificationService;
+ protected BindingAwareBroker.RpcRegistration<SequenceGeneratorService> rpcRegistration;
+ private final EELFLogger log = EELFManager.getInstance().getLogger(SequenceGeneratorProvider.class);
+ private final ExecutorService executor;
+ private final static String APP_NAME = "SequenceGeneratorProvider";
+
+ public SequenceGeneratorProvider(DataBroker dataBroker2, NotificationProviderService notificationProviderService
+ , RpcProviderRegistry rpcRegistry2) {
+ log.info("Creating provider for " + APP_NAME);
+ executor = Executors.newFixedThreadPool(1);
+ this.dataBroker = dataBroker2;
+ this.notificationService = notificationProviderService;
+
+ this.rpcRegistry = rpcRegistry2;
+
+ if (this.rpcRegistry != null) {
+ rpcRegistration = rpcRegistry.addRpcImplementation(SequenceGeneratorService.class, this);
+ }
+ log.info("Initialization complete for " + APP_NAME);
+ }
+
+ @Override
+ public void close() throws Exception {
+ log.info("Closing provider for " + APP_NAME);
+ if(this.executor != null){
+ executor.shutdown();
+ }
+ if(this.rpcRegistration != null){
+ rpcRegistration.close();
+ }
+ log.info("Successfully closed provider for " + APP_NAME);
+ }
+
+ @Override
+ public Future<RpcResult<GenerateSequenceOutput>> generateSequence(GenerateSequenceInput input) {
+ RpcResult<GenerateSequenceOutput> rpcResult=null;
+ log.debug("Received input = " + input );
+ try {
+ SequenceGenerator seqGenerator = SequenceGeneratorFactory.getInstance()
+ .createSequenceGenerator(VNFOperation.findByString(input.getRequestInfo().getAction().name()));
+ SequenceGeneratorInput seqGenInput = buildSeqGenInput(input);
+ List<Transaction> transactions = seqGenerator.generateSequence(seqGenInput);
+ rpcResult = buildSuccessResponse(transactions);
+ } catch (APPCException e) {
+ log.error("Error Generating Sequence",e);
+ rpcResult = buildFailureResponse(e.getMessage());
+ }
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ private RpcResult<GenerateSequenceOutput> buildSuccessResponse(List<Transaction> transactions) {
+
+ List<Transactions> transactionList = new LinkedList<>();
+ for(Transaction transaction:transactions){
+ ActionIdentifier actionIdentifier = null;
+ if(transaction.getActionIdentifier() != null){
+ actionIdentifier = new ActionIdentifierBuilder()
+ .setVnfId(transaction.getActionIdentifier().getVnfId())
+ .setVnfcName(transaction.getActionIdentifier().getVnfcName())
+ .setVserverId(transaction.getActionIdentifier().getvServerId())
+ .build();
+ }
+
+ List<PrecheckOptions> precheckOptions = new LinkedList<>();
+ if(transaction.getPrecheckOptions()!=null){
+ for(PreCheckOption option:transaction.getPrecheckOptions()){
+ PrecheckOptions precheckOption = new PrecheckOptionsBuilder()
+ .setParamName(option.getParamName())
+ .setParamValue(option.getParamValue())
+ .setPreTransactionId(option.getPreTransactionId())
+ .setRule(option.getRule())
+ .build();
+ precheckOptions.add(precheckOption);
+ }
+ }
+
+ List<Responses> responseList = getResponses(transaction);
+
+ Transactions transactionObj
+ = new TransactionsBuilder()
+ .setActionIdentifier(actionIdentifier)
+ .setAction(transaction.getAction())
+ .setActionLevel(transaction.getActionLevel())
+ .setPrecheckOperator(transaction.getPreCheckOperator())
+ .setPayload(transaction.getPayload())
+ .setTransactionId(transaction.getTransactionId())
+ .setPrecheckOptions(precheckOptions)
+ .setResponses(responseList)
+ .build();
+ transactionList.add(transactionObj);
+ }
+
+ GenerateSequenceOutputBuilder builder = new GenerateSequenceOutputBuilder()
+ .setTransactions(transactionList);
+
+ return RpcResultBuilder
+ .<GenerateSequenceOutput> status(true)
+ .withResult(builder.build()).build();
+ }
+
+ private List<Responses> getResponses(Transaction transaction) {
+ List<Responses> responseList = new LinkedList<>();
+ for(Response resp : transaction.getResponses()){
+ Map<String,String> responseActions = resp.getResponseAction();
+ ResponseActionBuilder responseActionBuilder = new ResponseActionBuilder();
+ if(responseActions.get(Constants.ResponseAction.WAIT.getAction())!=null){
+ responseActionBuilder = responseActionBuilder.setWait(Integer.parseInt(responseActions.get(Constants.ResponseAction.WAIT.getAction())));
+ }
+ if(responseActions.get(Constants.ResponseAction.RETRY.getAction())!=null){
+ responseActionBuilder = responseActionBuilder.setRetry(Integer.parseInt(responseActions.get(Constants.ResponseAction.RETRY.getAction())));
+ }
+ if(responseActions.get(Constants.ResponseAction.CONTINUE.getAction().toLowerCase())!=null){
+ responseActionBuilder = responseActionBuilder
+ .setContinue(Boolean.parseBoolean(responseActions.get(Constants.ResponseAction.CONTINUE.getAction().toLowerCase())));
+ }
+ if(responseActions.get(Constants.ResponseAction.IGNORE.getAction()) !=null){
+ responseActionBuilder = responseActionBuilder.setIgnore(Boolean.parseBoolean(responseActions.get(Constants.ResponseAction.IGNORE.getAction())));
+ }
+ if(responseActions.get(Constants.ResponseAction.STOP.getAction()) !=null){
+ responseActionBuilder = responseActionBuilder.setStop(Boolean.parseBoolean(responseActions.get(Constants.ResponseAction.STOP.getAction())));
+ }
+ Responses response = new ResponsesBuilder()
+ .setResponseMessage(resp.getResponseMessage())
+ .setResponseAction(responseActionBuilder.build())
+ .build();
+ responseList.add(response);
+ }
+ return responseList;
+ }
+
+ private SequenceGeneratorInput buildSeqGenInput(GenerateSequenceInput input) throws APPCException {
+
+ validateMandatory(input);
+
+ RequestInfoBuilder requestInfobuilder = new RequestInfoBuilder()
+ .action(input.getRequestInfo().getAction().name())
+ .actionLevel(input.getRequestInfo().getActionLevel().getName().toLowerCase())
+ .payload(input.getRequestInfo().getPayload());
+
+ if(input.getRequestInfo().getActionIdentifier() !=null){
+ requestInfobuilder = requestInfobuilder
+ .actionIdentifier()
+ .vnfId(input.getRequestInfo().getActionIdentifier().getVnfId())
+ .vnfcName(input.getRequestInfo().getActionIdentifier().getVnfcName())
+ .vServerId(input.getRequestInfo().getActionIdentifier().getVserverId());
+ }
+
+ RequestInfo requestInfo = requestInfobuilder.build();
+
+ InventoryModel inventoryModel = readInventoryModel(input);
+
+ VnfcDependencyModel dependencyModel = readDependencyModel(input);
+
+ SequenceGeneratorInputBuilder builder = new SequenceGeneratorInputBuilder()
+ .requestInfo(requestInfo)
+ .inventoryModel(inventoryModel)
+ .dependendcyModel(dependencyModel);
+
+ if(input.getCapabilities() !=null){
+ if(input.getCapabilities().getVnf()!=null){
+ builder = builder.capability("vnf",input.getCapabilities().getVnf());
+ }
+ if(input.getCapabilities().getVnfc()!=null){
+ builder = builder.capability("vnfc",input.getCapabilities().getVnfc());
+ }
+ if(input.getCapabilities().getVm()!=null){
+ builder = builder.capability("vm",input.getCapabilities().getVm());
+ }
+ if(input.getCapabilities().getVfModule()!=null){
+ builder = builder.capability("vf-module",input.getCapabilities().getVfModule());
+ }
+ }
+
+ if(input.getTunableParameters() != null){
+ builder = builder.tunableParameter(Constants.RETRY_COUNT,String.valueOf(input.getTunableParameters().getRetryCount()))
+ .tunableParameter(Constants.WAIT_TIME,String.valueOf(input.getTunableParameters().getWaitTime()));
+ if(input.getTunableParameters().getStrategy() !=null){
+ builder = builder.tunableParameter(Constants.STRATEGY,input.getTunableParameters().getStrategy().name());
+ }
+ }
+ return builder.build();
+ }
+
+
+ private void validateMandatory(GenerateSequenceInput input) throws APPCException {
+ if(input.getRequestInfo() ==null){
+ throw new APPCException("Request Info is not present in the request");
+ }
+ if(input.getRequestInfo().getAction() ==null){
+ throw new APPCException("Action is not present in the request");
+ }
+ if(input.getInventoryInfo() ==null){
+ throw new APPCException("inventoryInfo is not provided in the input");
+ }
+ }
+
+ private VnfcDependencyModel readDependencyModel(GenerateSequenceInput input) {
+ if(input.getDependencyInfo() == null || input.getDependencyInfo().getVnfcs() ==null || input.getDependencyInfo().getVnfcs().isEmpty()){
+ return null;
+ }
+ List<Vnfcs> vnfcs = input.getDependencyInfo().getVnfcs();
+ Set<Node<org.openecomp.appc.domainmodel.Vnfc>> dependencies = new HashSet<>();
+ for(Vnfcs vnfcObj:vnfcs){
+ org.openecomp.appc.domainmodel.Vnfc vnfc;
+ Node<org.openecomp.appc.domainmodel.Vnfc> currentNode = readNode(vnfcObj.getVnfcType(),dependencies);
+ if(currentNode == null){
+ vnfc = new org.openecomp.appc.domainmodel.Vnfc(vnfcObj.getVnfcType(),vnfcObj.getResilience());
+ currentNode = new Node<>(vnfc);
+ dependencies.add(currentNode);
+ }
+ else{
+ currentNode.getChild().setResilienceType(vnfcObj.getResilience());
+ currentNode.getChild().setMandatory(vnfcObj.isMandatory());
+ }
+ for(String parentVnfcType:vnfcObj.getParents()){
+ Node<org.openecomp.appc.domainmodel.Vnfc> parentNode = readNode(parentVnfcType,dependencies);
+ if(parentNode == null){
+ org.openecomp.appc.domainmodel.Vnfc parentVnfc = new org.openecomp.appc.domainmodel.Vnfc(parentVnfcType,null);
+ parentNode = new Node<>(parentVnfc);
+ currentNode.addParent(parentVnfc);
+ dependencies.add(parentNode);
+ }
+ else{
+ currentNode.addParent(parentNode.getChild());
+ }
+ }
+ }
+ return new VnfcDependencyModel(dependencies);
+ }
+
+ private Node<org.openecomp.appc.domainmodel.Vnfc> readNode(String vnfcType, Set<Node<org.openecomp.appc.domainmodel.Vnfc>> dependencies) {
+ for(Node<org.openecomp.appc.domainmodel.Vnfc> node : dependencies){
+ if(node.getChild().getVnfcType().equalsIgnoreCase(vnfcType)){
+ return node;
+ }
+ }
+ return null;
+ }
+
+ private InventoryModel readInventoryModel(GenerateSequenceInput input) throws APPCException {
+ if (input.getInventoryInfo().getVnfInfo()== null) {
+ throw new APPCException("vnfInfo is not provided in the input");
+ }
+
+ Vnf vnf = new Vnf(input.getInventoryInfo().getVnfInfo().getVnfId(),
+ input.getInventoryInfo().getVnfInfo().getVnfType(),null);
+
+ Map<org.openecomp.appc.domainmodel.Vnfc,List<Vserver>> map = new HashMap<>();
+ for(Vm vm:input.getInventoryInfo().getVnfInfo().getVm()){
+ if(StringUtils.isBlank(vm.getVserverId())){
+ throw new APPCException("vserver-id not found ");
+ }
+ if(StringUtils.isBlank(vm.getVnfc().getVnfcType())){
+ throw new APPCException("vnfc-type not found for vserver " + vm.getVserverId());
+ }
+ if(StringUtils.isBlank(vm.getVnfc().getVnfcName())){
+ throw new APPCException("vnfc-name not found for vserver " + vm.getVserverId());
+ }
+
+ org.openecomp.appc.domainmodel.Vnfc vnfc = new org.openecomp.appc.domainmodel.Vnfc(vm.getVnfc().getVnfcType(),null,vm.getVnfc().getVnfcName());
+ List<Vserver> vms = map.get(vnfc);
+ if(vms ==null){
+ vms = new LinkedList<>();
+ map.put(vnfc,vms);
+ }
+ vms.add(new Vserver(null,null,vm.getVserverId(),null,null));
+ }
+ for(Map.Entry<org.openecomp.appc.domainmodel.Vnfc,List<Vserver>> entry:map.entrySet()){
+ org.openecomp.appc.domainmodel.Vnfc vnfc = entry.getKey();
+ List<Vserver> vmList = entry.getValue();
+ vnfc.addVms(vmList);
+ vnf.addVnfc(vnfc);
+ }
+ return new InventoryModel(vnf);
+ }
+
+ private RpcResult<GenerateSequenceOutput> buildFailureResponse(String errorMessage){
+ GenerateSequenceOutputBuilder sequenceGeneratorOutputBuilder=new GenerateSequenceOutputBuilder();
+ StatusBuilder statusBuilder =new StatusBuilder();
+ statusBuilder.setCode(401);
+ statusBuilder.setMessage(errorMessage);
+ sequenceGeneratorOutputBuilder.setStatus(statusBuilder.build());
+ return RpcResultBuilder
+ .<GenerateSequenceOutput> status(true)
+ .withResult(sequenceGeneratorOutputBuilder.build())
+ .build();
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..9422bd3
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<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="sequenceGeneratorDGPlugin" class="org.openecomp.appc.seqgen.dgplugin.impl.SequenceGeneratorPluginImpl"/>
+ <service interface="org.openecomp.appc.seqgen.dgplugin.SequenceGeneratorPlugin" ref="sequenceGeneratorDGPlugin"/>
+
+</blueprint>
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/initial/appc-sequence-generator.xml b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/initial/appc-sequence-generator.xml
new file mode 100644
index 0000000..fb48c25
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/initial/appc-sequence-generator.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<snapshot>
+ <configuration>
+ <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <module>
+
+ <!-- This xmlns:prefix should match the namespace in the *-impl.yang file
+ The prefix: inside type should match the prefix of the yang file. -->
+ <type xmlns:prefix="org:openecomp:appc:sequencegenerator:impl">
+ prefix:sequence-generator-impl
+ </type>
+ <name>sequence-generator-impl</name>
+
+ <!-- The following sections contain bindings to services defined in the
+ *-impl yang file. For example the rpc-registry is required
+ because we have a dependency (or augmentation) named "rpc-registry"
+ and which binds to the md-sa-binding-registry. If you remove those
+ dependencies from the yang file then you can remove them from here. -->
+ <rpc-registry>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
+ <name>binding-rpc-broker</name>
+ </rpc-registry>
+
+ <data-broker>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
+ <name>binding-data-broker</name>
+ </data-broker>
+
+ <notification-service>
+ <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
+ binding:binding-notification-service
+ </type>
+ <name>binding-notification-broker</name>
+ </notification-service>
+ </module>
+
+ </modules>
+ </data>
+
+ </configuration>
+
+ <!-- Required capabilities are basically a listing of all modules that need to be imported before
+ our service can be resolved. Capabilities for dependencies defined above are implied which is
+ why we do not have define a required capability for the data broker, for example. -->
+ <required-capabilities>
+ <capability>org:openecomp:appc:sequencegenerator:impl?module=sequence-generator-impl&revision=2017-07-06</capability>
+ </required-capabilities>
+
+</snapshot>
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/default.properties b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/default.properties
new file mode 100644
index 0000000..a3e3f8a
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/default.properties
@@ -0,0 +1,54 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APP-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+#
+# This property file supplies the configuration defaults for the APP-C controller
+#
+# Default values are supplied so that all defined properties have well-known values and are
+# valid even if a configuration file is not supplied. This is done to ensure that a runnable,
+# stable, and defined configuration exists at all times. The reason the defaults are supplied
+# via this property file and not in the code is so that the properties can be changed
+# easily if needed in the future. Use of the "getProperty(name, default)" method is
+# discouraged because if the default value needs to be changed, everywhere in the code it
+# is used would have to be changed. By loading the defaults in this property file, all
+# values can be defined in one place and support is easier. This does mean that all
+# properties that are defined must have a default value supplied here. Which also means
+# this file documents all defined properties (not a bad thing either).
+#
+#--------------------------------------------------------------------------------------------
+# The path and file used to load user-supplied configuration settings, if any
+org.openecomp.appc.bootstrap.file=appc.properties
+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
+
+appc.application.name=APPC
+
+#
+# The path to search for logging configuration document, and the name of the document
+#
+org.openecomp.appc.logging.path=${user.home},etc,../etc,.
+org.openecomp.appc.logging.file=logback.xml
+
+#
+# The DG properties
+#
+appc.service.logic.module.name=APPC
+appc.topology.dg.method=topology-operation-all
+appc.topology.dg.version=2.0.0
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/logback.xml b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/logback.xml
new file mode 100644
index 0000000..0cefc8c
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/resources/org.openecomp.appc/logback.xml
@@ -0,0 +1,283 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!--<jmxConfigurator /> -->
+ <property name="logDirectory" value="logs" />
+ <property name="debugLogDirectory" value="debug-logs" />
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- CDP Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The CDPAppender is used to record events to the general CDP application
+ log. This is the log file used by default as the application root log, if
+ no other log is defined or the application creates specialized loggers of
+ the form com.att.cdp.x.y.z where the name occupied by the "x" is NOT security,
+ perf, server, coordinator, gui, or policy. These are defined as specialization
+ loggers for various business purposes. -->
+ <appender name="CDP"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger [%X{User} %X{RemoteHost} %X{RequestId} %X{Method}
+ %X{Path}] - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDP" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="CDP" />
+ </appender>
+
+ <!-- CDP Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in CDP so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <appender name="CDPSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp-security.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp-security.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger [%X{User} %X{RemoteHost} %X{RequestId} %X{Method}
+ %X{Path}] - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDPSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="CDPSecurity" />
+ </appender>
+
+ <!-- CDP Performance Appender. This appender is used to record performance
+ records. -->
+ <appender name="CDPPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp-performance.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp-performance.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger [%X{User} %X{RemoteHost} %X{RequestId} %X{Method}
+ %X{Path}] - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDPPerformance" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="CDPPerformance" />
+ </appender>
+
+ <!-- CDP Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ CDP application root logger and appender. This can be used to segregate Server
+ events from other components, or it can be eliminated to record these events
+ as part of the application root log. -->
+ <appender name="CDPServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp-server.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp-server.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger [%X{User} %X{RemoteHost} %X{RequestId} %X{Method}
+ %X{Path}] - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDPServer" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="CDPServer" />
+ </appender>
+
+ <!-- CDP Coordinator Appender. This appender is used to record Coordinator
+ related logging events. The Coordinator logger and appender are specializations
+ of the CDP application root logger and appender. This can be used to segregate
+ Coordinator events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <appender name="CDPCoordinator"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp-coordinator.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp-coordinator.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDPCoordinator" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="CDPCoordinator" />
+ </appender>
+
+ <!-- CDP Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy logger and appender are specializations
+ of the CDP application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <appender name="CDPPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/cdp-policy.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/cdp-policy.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>%d{MM/dd-HH:mm:ss.SSS} [%-16thread] %.-5level
+ %-36.36logger - %msg%n</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncCDPPolicy" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="CDPPolicy" />
+ </appender>
+ <appender name="CommandExecutor"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/appc-debug.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/command-executor.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!--<Pattern>
+ %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}|%X{RequestID}|%X{ServiceInstanceID}|%thread|%X{ServerName}|%X{ServiceName}|%X{UUID}|%-5.5p|%X{Severity}|%X{ServerIPAddress}|%X{Server}|%X{IPAddress}|[%c{3}]|%X{Timer}| - %msg%n
+ </Pattern>-->
+ <Pattern>
+ %d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%t|%X{ServiceName} - %X{bundle.id} - %X{bundle.name} - %X{bundle.version}|%X{InstanceUUID}|%-5.5p|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%c{3}]|%m%n
+ </Pattern>
+ </encoder>
+ </appender>
+
+ <logger name="org.openecomp.appc" level="DEBUG" additivity="false">
+ <appender-ref ref="CommandExecutor" />
+ </logger>
+
+ <!-- ============================================================================ -->
+ <!-- CDP loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.cdp" level="info" additivity="false">
+ <appender-ref ref="asyncCDP" />
+ </logger>
+ <logger name="com.att.cdp.security" level="info" additivity="false">
+ <appender-ref ref="asyncCDPSecurity" />
+ </logger>
+ <logger name="com.att.cdp.perf" level="info" additivity="false">
+ <appender-ref ref="asyncCDPPerformance" />
+ </logger>
+ <logger name="com.att.cdp.server" level="debug" additivity="false">
+ <appender-ref ref="asyncCDPServer" />
+ </logger>
+ <logger name="com.att.cdp.coordinator" level="info" additivity="false">
+ <appender-ref ref="asyncCDPCoordinator" />
+ </logger>
+ <logger name="com.att.cdp.policy" level="info" additivity="false">
+ <appender-ref ref="asyncCDPPolicy" />
+ </logger>
+
+ <!-- The OpenStack connector logger -->
+ <logger name="os" level="debug" additivity="false">
+ <appender-ref ref="asyncCDPServer" />
+ </logger>
+
+ <root level="WARN">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+</configuration>
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/main/yang/sequence-generator.yang b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/yang/sequence-generator.yang
new file mode 100644
index 0000000..50c0097
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/main/yang/sequence-generator.yang
@@ -0,0 +1,62 @@
+module sequence-generator-impl {
+
+ yang-version 1;
+ namespace "org:openecomp:appc:sequencegenerator:impl";
+ prefix "sequence-generator-impl";
+
+ import config { prefix config; revision-date 2013-04-05; }
+ import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+
+ description
+ "This module contains the base YANG definitions for
+ sequence-generator-impl implementation.";
+
+ revision "2017-07-06" {
+ description
+ "Initial revision.";
+ }
+
+ // This is the definition of the service implementation as a module identity.
+ identity sequence-generator-impl {
+ base config:module-type;
+
+ // Specifies the prefix for generated java classes.
+ config:java-name-prefix SequenceGenerator;
+ }
+
+ // Augments the 'configuration' choice node under modules/module.
+ // We consume the two main services, RPCs and DataStore
+ // Notification service is not used
+ augment "/config:modules/config:module/config:configuration" {
+ case sequence-generator-impl {
+ when "/config:modules/config:module/config:type = 'sequence-generator-impl'";
+
+ container rpc-registry {
+ uses config:service-ref {
+ refine type {
+ mandatory true;
+ config:required-identity mdsal:binding-rpc-registry;
+ }
+ }
+ }
+
+ container notification-service {
+ uses config:service-ref {
+ refine type {
+ mandatory true;
+ config:required-identity mdsal:binding-notification-service;
+ }
+ }
+ }
+
+ container data-broker {
+ uses config:service-ref {
+ refine type {
+ mandatory false;
+ config:required-identity mdsal:binding-async-data-broker;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/java/org/openecomp/appc/seqgen/TestSequenceGeneratorPlugin.java b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/java/org/openecomp/appc/seqgen/TestSequenceGeneratorPlugin.java
new file mode 100644
index 0000000..2bb9cd6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/java/org/openecomp/appc/seqgen/TestSequenceGeneratorPlugin.java
@@ -0,0 +1,256 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APP-C
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.appc.seqgen;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.appc.seqgen.dgplugin.SequenceGeneratorPlugin;
+import org.openecomp.appc.seqgen.dgplugin.impl.SequenceGeneratorPluginImpl;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestSequenceGeneratorPlugin {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(TestSequenceGeneratorPlugin.class);
+
+ @Test
+ public void testGenerateSequenceStart() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/start.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/start.json");
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+
+
+ @Test
+ public void testGenerateSequenceSingleVM()throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/start-single-vm.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/start-single-vm.json");
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ @Test
+ public void testGenerateSequenceNoStrategy() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/no-strategy.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/start.json");
+
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ @Test
+ public void testGenerateSequenceStop() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/stop.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/stop.json");
+
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ @Test
+ public void testGenerateSequenceWrongNumber() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/wrongnumber.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String errorCode = context.getAttribute("error-code");
+ String errorMessage = context.getAttribute("error-message");
+ logger.debug("errorCode = " + errorCode);
+ Assert.assertEquals(errorCode,"401");
+ Assert.assertEquals(errorMessage,"Error generating sequence Invalid Number for Wait Time 6a");
+ }
+
+
+ @Test
+ public void testGenerateSequenceCyclic() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/cyclic.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String errorCode = context.getAttribute("error-code");
+ String errorMessage = context.getAttribute("error-message");
+ logger.debug("errorCode = " + errorCode);
+ Assert.assertEquals(errorCode,"401");
+ Assert.assertEquals(errorMessage,"Error generating sequence There seems to be no Root/Independent node for Vnfc dependencies");
+ }
+
+
+ @Test
+ public void testGenerateSequenceWrongAction() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/wrongaction.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String errorCode = context.getAttribute("error-code");
+ String errorMessage = context.getAttribute("error-message");
+ logger.debug("errorCode = " + errorCode);
+ Assert.assertEquals(errorCode,"401");
+ Assert.assertEquals(errorMessage,"Error generating sequence Invalid Action start");
+ }
+
+
+ @Test
+ public void testGenerateSequenceMissingRequestInfo() throws URISyntaxException, IOException {
+ String inputJSON = readInput("/input/missingrequestinfo.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String errorCode = context.getAttribute("error-code");
+ String errorMessage = context.getAttribute("error-message");
+ logger.debug("errorCode = " + errorCode);
+ Assert.assertEquals(errorCode,"401");
+ Assert.assertEquals(errorMessage,"Error generating sequence Request info is not provided in the input");
+ }
+
+ @Test
+ public void testGenerateSequenceStopSingleVM() throws URISyntaxException, IOException{
+ String inputJSON = readInput("/input/stop-single-vm.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/stop-single-vm.json");
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ @Test
+ public void testGenerateSequenceStopSingleVmPerVnfc() throws URISyntaxException, IOException{
+ String inputJSON = readInput("/input/stop-single-vm-per-vnfc.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/stop-single-vm-per-vnfc.json");
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ @Test
+ public void testGenerateSequenceStartSingleVmPerVnfc() throws URISyntaxException, IOException{
+ String inputJSON = readInput("/input/start-single-vm-per-vnfc.json");
+
+ Map<String,String> params = new HashMap<>();
+ SvcLogicContext context = new SvcLogicContext();
+ context.setAttribute("inputJSON",inputJSON);
+
+ SequenceGeneratorPlugin plugin = new SequenceGeneratorPluginImpl();
+ plugin.generateSequence(params,context);
+
+ String outputJSON = context.getAttribute("output");
+ String actualOutput = readOutput("/output/start-single-vm-per-vnfc.json");
+ Assert.assertEquals(outputJSON.trim(),actualOutput.trim());
+ }
+
+ private String readInput(String inputFile) throws URISyntaxException, IOException {
+ File file = new File(this.getClass().getResource(inputFile).toURI());
+
+ byte[] bFile = new byte[(int) file.length()];
+ FileInputStream fileInputStream = new FileInputStream(file);
+ fileInputStream.read(bFile);
+ fileInputStream.close();
+ return new String(bFile);
+ }
+ private String readOutput(String outputFile) throws IOException,URISyntaxException {
+ File file = new File(this.getClass().getResource(outputFile).toURI());
+
+ byte[] bFile = new byte[(int) file.length()];
+ FileInputStream fileInputStream = new FileInputStream(file);
+ fileInputStream.read(bFile);
+ fileInputStream.close();
+
+ String output=new String(bFile);
+ int start=output.indexOf("[");
+ int last=output.length()-1;
+ return output.substring(start,last);
+
+ }
+}
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/cyclic.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/cyclic.json
new file mode 100644
index 0000000..522b996
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/cyclic.json
@@ -0,0 +1,198 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm": [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info" :
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" :
+ [
+ "VNFC3"
+ ]
+ }
+ ]
+ },
+ "tunable-parameters" :
+ {
+ "strategy" : "FORWARD",
+ "wait-time" : "120",
+ "retry-count" : "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/mandatory-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/mandatory-vnfc.json
new file mode 100644
index 0000000..3e96b56
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/mandatory-vnfc.json
@@ -0,0 +1,177 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm": [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/missingrequestinfo.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/missingrequestinfo.json
new file mode 100644
index 0000000..c5bc7ea
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/missingrequestinfo.json
@@ -0,0 +1,186 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/no-strategy.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/no-strategy.json
new file mode 100644
index 0000000..1371d22
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/no-strategy.json
@@ -0,0 +1,195 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm": [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc-data.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc-data.json
new file mode 100644
index 0000000..cc5d3a0
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc-data.json
@@ -0,0 +1,196 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "false",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc.json
new file mode 100644
index 0000000..a306769
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/optional-vnfc.json
@@ -0,0 +1,176 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "false",
+ "resilience": "Active-Active",
+ "parents" : [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" : {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-duplicate.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-duplicate.json
new file mode 100644
index 0000000..3f22fd6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-duplicate.json
@@ -0,0 +1,92 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vserver-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-per-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-per-vnfc.json
new file mode 100644
index 0000000..dac5028
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm-per-vnfc.json
@@ -0,0 +1,93 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vserver-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm.json
new file mode 100644
index 0000000..ef76ec2
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-single-vm.json
@@ -0,0 +1,84 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vserver-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-without-dependency.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-without-dependency.json
new file mode 100644
index 0000000..ec6a2b7
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start-without-dependency.json
@@ -0,0 +1,156 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start.json
new file mode 100644
index 0000000..143b41d
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/start.json
@@ -0,0 +1,196 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info" :
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters" :
+ {
+ "strategy" : "FORWARD",
+ "wait-time" : "120",
+ "retry-count" : "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-action-level-val.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-action-level-val.json
new file mode 100644
index 0000000..f089748
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-action-level-val.json
@@ -0,0 +1,196 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Stop",
+ "action-level": "heel ",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm-per-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm-per-vnfc.json
new file mode 100644
index 0000000..210f9ac
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm-per-vnfc.json
@@ -0,0 +1,92 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Stop",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vserver-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ }
+ ]
+ }},
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm.json
new file mode 100644
index 0000000..9679c9b
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-single-vm.json
@@ -0,0 +1,84 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Stop",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vserver-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+
+ },
+ "tunable-parameters":
+ {
+
+ },
+ "capabilities" :
+ {
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-without-dep.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-without-dep.json
new file mode 100644
index 0000000..6f70cca
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop-without-dep.json
@@ -0,0 +1,197 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Stop",
+ "action-level": "vm",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": " {\"vnf-host-ip-address\": \"10.147.124.163\" }"
+
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop.json
new file mode 100644
index 0000000..9131a65
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/stop.json
@@ -0,0 +1,197 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Stop",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": " {\"vnf-host-ip-address\": \"10.147.124.163\" }"
+
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongaction.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongaction.json
new file mode 100644
index 0000000..72f6ed8
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongaction.json
@@ -0,0 +1,196 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "120",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongnumber.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongnumber.json
new file mode 100644
index 0000000..958df03
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/input/wrongnumber.json
@@ -0,0 +1,196 @@
+/*-
+ * ============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=========================================================
+ */
+
+
+
+
+{
+ "request-info":
+ {
+ "action": "Start",
+ "action-level": "vnf",
+ "action-identifier":
+ {
+ "vnf-id": "dbgx0001v"
+ },
+ "payload": "ABC"
+ },
+ "inventory-info":
+ {
+ "vnf-info":
+ {
+ "vnf-id" : "abc",
+ "vnf-name": "vVNF",
+ "vnf-type": "vVNF",
+ "vnf-version" : "1.0",
+ "vm":
+ [
+ {
+ "vserver-id" : "vnfc2_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc3_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC3",
+ "vnfc-name": "VNFC3 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid3",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid1",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc1_vserverid2",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC1",
+ "vnfc-name": "VNFC1 - Name"
+ }
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid4",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ },
+ {
+ "vserver-id" : "vnfc2_vserverid5",
+ "vnfc":
+ {
+ "vnfc-type": "VNFC2",
+ "vnfc-name": "VNFC2 - Name"
+ }
+
+ }
+ ]
+ }
+ },
+ "dependency-info":
+ {
+ "vnfcs" :
+ [
+ {
+ "vnfc-type" : "VNFC2",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC1"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC3",
+ "mandatory" : "true",
+ "resilience": "Active-Active",
+ "parents" :
+ [
+ "VNFC2"
+ ]
+ },
+ {
+ "vnfc-type" : "VNFC1",
+ "mandatory" : "true",
+ "resilience": "Active-Passive",
+ "parents" : []
+ }
+ ]
+ },
+ "tunable-parameters":
+ {
+ "strategy" : "FORWARD",
+ "wait-time": "6a",
+ "retry-count": "5"
+ },
+ "capabilities" :
+ {
+ "vnf":
+ [
+ "Stop",
+ "Start",
+ "StartApplication",
+ "StopApplication"
+ ],
+ "vf-module":
+ [
+ "Stop",
+ "Start"
+ ],
+ "vm" :
+ [
+ "Stop",
+ "Start"
+ ],
+ "vnfc":
+ [
+ "StopApplication",
+ "StartApplication",
+ "HealthCheck"
+ ]
+ }
+}
+
+
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc-with-data.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc-with-data.json
new file mode 100644
index 0000000..15e7faa
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc-with-data.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":1,"param-name":"status","param-value":"success"},{"pre-transactionID":2,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":4,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]},{"transactionId":5,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":10,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":5,"param-name":"status","param-value":"success"},{"pre-transactionID":6,"param-name":"status","param-value":"success"},{"pre-transactionID":7,"param-name":"status","param-value":"success"},{"pre-transactionID":8,"param-name":"status","param-value":"success"},{"pre-transactionID":9,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":11,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]},{"transactionId":12,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":13,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":14,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC3 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":12,"param-name":"status","param-value":"success"},{"pre-transactionID":13,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":15,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC3 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc.json
new file mode 100644
index 0000000..1981427
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/optional-vnfc.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":1,"param-name":"status","param-value":"success"},{"pre-transactionID":2,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":4,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy", "response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]},{"transactionId":5,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":10,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":5,"param-name":"status","param-value":"success"},{"pre-transactionID":6,"param-name":"status","param-value":"success"},{"pre-transactionID":7,"param-name":"status","param-value":"success"},{"pre-transactionID":8,"param-name":"status","param-value":"success"},{"pre-transactionID":9,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":11,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm-per-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm-per-vnfc.json
new file mode 100644
index 0000000..600e315
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm-per-vnfc.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm.json
new file mode 100644
index 0000000..be4dc57
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-single-vm.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-without-dependency.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-without-dependency.json
new file mode 100644
index 0000000..2bb3445
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start-without-dependency.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":4,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":5,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start.json
new file mode 100644
index 0000000..15e7faa
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/start.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":1,"param-name":"status","param-value":"success"},{"pre-transactionID":2,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":4,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]},{"transactionId":5,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":10,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":5,"param-name":"status","param-value":"success"},{"pre-transactionID":6,"param-name":"status","param-value":"success"},{"pre-transactionID":7,"param-name":"status","param-value":"success"},{"pre-transactionID":8,"param-name":"status","param-value":"success"},{"pre-transactionID":9,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":11,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]},{"transactionId":12,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":13,"action":"Start","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid2"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":14,"action":"StartApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC3 - Name"},"payload":"ABC","precheck-operator":"any","precheck-options":[{"pre-transactionID":12,"param-name":"status","param-value":"success"},{"pre-transactionID":13,"param-name":"status","param-value":"success"}],"responses":[]},{"transactionId":15,"action":"HealthCheck","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC3 - Name"},"payload":"ABC","responses":[{"response-message":"unhealthy","response-action":{"wait":"120","retry":"5"}},{"response-message":"healthy","response-action":{"continue":"true"}},{"response-message":"failure","response-action":{"stop":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm-per-vnfc.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm-per-vnfc.json
new file mode 100644
index 0000000..97d2d1b
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm-per-vnfc.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":"ABC","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm.json
new file mode 100644
index 0000000..b237fe6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-single-vm.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":"ABC","responses":[]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-without-dep.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-without-dep.json
new file mode 100644
index 0000000..85f3b96
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop-without-dep.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":4,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":5,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop.json b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop.json
new file mode 100644
index 0000000..c401ed6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-bundle/src/test/resources/output/stop.json
@@ -0,0 +1,3 @@
+
+
+[{"transactionId":1,"action":"StopApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC1 - Name"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":2,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":3,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc1_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":4,"action":"StopApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC2 - Name"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":5,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":6,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":7,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid3"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":8,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid4"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":9,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc2_vserverid5"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":10,"action":"StopApplication","action-level":"vnfc","action-identifier":{"vnfc-name":"VNFC3 - Name"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":11,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid1"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]},{"transactionId":12,"action":"Stop","action-level":"vm","action-identifier":{"vserver-id":"vnfc3_vserverid2"},"payload":" {\"vnf-host-ip-address\": \"10.147.124.163\" }","responses":[{"response-message":"failure","response-action":{"ignore":"true"}}]}]
diff --git a/appc-sequence-generator/appc-sequence-generator-features/pom.xml b/appc-sequence-generator/appc-sequence-generator-features/pom.xml
new file mode 100644
index 0000000..5f4fbe6
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-features/pom.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>appc-sequence-generator-features</artifactId>
+ <name>Application Controller Sequence Generator Features</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>features-mdsal</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>features-yangtools</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-domain-model-lib</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-dependency-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</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>
+ <!– launches the feature test, which validates that your karaf feature
+ can be installed inside of a karaf container. It doesn't validate that your
+ functionality works correctly, just that you have all of the dependent bundles
+ defined correctly. –>
+ <!– Skipping ODL feature test –>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.16</version>
+ <configuration>
+ <systemPropertyVariables>
+ <karaf.distro.groupId>org.opendaylight.controller</karaf.distro.groupId>
+ <karaf.distro.artifactId>opendaylight-karaf-empty</karaf.distro.artifactId>
+ <karaf.distro.version>${odl.karaf.empty.distro.version}</karaf.distro.version>
+ </systemPropertyVariables>
+ <dependenciesToScan>
+ <dependency>org.opendaylight.yangtools:features-test</dependency>
+ </dependenciesToScan>
+ <classpathDependencyExcludes>
+ <!– The dependencies which bring in AbstractDataBrokerTest class brings
+ in a second PaxExam container which results in the feature tests failing
+ with a message similar to: "ERROR o.ops4j.pax.exam.spi.PaxExamRuntime - Ambiguous
+ TestContainer ..." This excludes the container we don't want to use. –>
+ <classpathDependencyExcludes>org.ops4j.pax.exam:pax-exam-container-native</classpathDependencyExcludes>
+ </classpathDependencyExcludes>
+ <skipTests>true</skipTests>
+ </configuration>
+ </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>
+ </plugins>
+ </build>
+</project>
diff --git a/appc-sequence-generator/appc-sequence-generator-features/src/main/resources/features.xml b/appc-sequence-generator/appc-sequence-generator-features/src/main/resources/features.xml
new file mode 100644
index 0000000..4a3e469
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-features/src/main/resources/features.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+
+<features name="appc-${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">
+
+ <repository>mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features</repository>
+
+ <feature name='appc-sequence-generator' description="Appc Sequence Generator"
+ version='${project.version}'>
+ <!--<feature version="${odl.controller.mdsal.version}">odl-mdsal-broker</feature>-->
+ <!--<feature version="${sdnc.sli.version}">sdnc-sli</feature>-->
+ <bundle dependency="true">mvn:org.openecomp.appc/domain-model-lib/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-common/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-sequence-generator-model/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-sequence-generator-bundle/${project.version}</bundle>
+ <bundle>wrap:mvn:org.openecomp.appc/appc-dg-domain-model-lib/${project.version}</bundle>
+ <bundle>wrap:mvn:org.openecomp.appc/appc-dg-dependency-model/${project.version}</bundle>
+ <configfile finalname="etc/opendaylight/karaf/201-appc-sequence-generator.xml">
+ mvn:org.openecomp.appc/appc-sequence-generator-bundle/${project.version}/xml/config</configfile>
+ </feature>
+
+</features>
diff --git a/appc-sequence-generator/appc-sequence-generator-installer/pom.xml b/appc-sequence-generator/appc-sequence-generator-installer/pom.xml
new file mode 100644
index 0000000..c7b7428
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-installer/pom.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>appc-sequence-generator-installer</artifactId>
+ <name>Appc Sequence Generator : Karaf Installer</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <application.name>appc-sequence-generator</application.name>
+ <features.boot>appc-sequence-generator</features.boot>
+ <features.repositories>mvn:com.att.appc/appc-sequence-generator-features/${project.version}/xml/features</features.repositories>
+ <include.transitive.dependencies>false</include.transitive.dependencies>
+ </properties>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-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-sequence-generator-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-bundle</artifactId>
+ <classifier>config</classifier>
+ <version>${project.version}</version>
+ <type>xml</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-model</artifactId>
+ <version>${project.version}</version>
+ <!--<type>properties</type>-->
+ </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>
+ <transitive>false</transitive>
+ <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>
+ <scope>provided</scope>
+ </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>
\ No newline at end of file
diff --git a/appc-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_installer_zip.xml b/appc-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 0000000..cfa3f8f
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,58 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<!-- 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-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_mvnrepo_zip.xml b/appc-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 0000000..7510c1b
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,53 @@
+<!--
+ ============LICENSE_START=======================================================
+ ONAP : APP-C
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ============LICENSE_END=========================================================
+ -->
+
+<!-- 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>
+
+ <files>
+ <file>
+ <source>../${feature-name}-bundle/src/main/resources/initial/${feature-name}.xml</source>
+ <destName>./etc/opendaylight/karaf/201-${feature-name}.xml</destName>
+ </file>
+ </files>
+
+</assembly>
diff --git a/appc-sequence-generator/appc-sequence-generator-installer/src/main/resources/scripts/install-feature.sh b/appc-sequence-generator/appc-sequence-generator-installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 0000000..c5a39bf
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,39 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APP-C
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+###
+
+#!/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
+
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories}
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot}
diff --git a/appc-sequence-generator/appc-sequence-generator-model/pom.xml b/appc-sequence-generator/appc-sequence-generator-model/pom.xml
new file mode 100644
index 0000000..8c492b0
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-model/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>appc-sequence-generator-model</artifactId>
+ <name>appc-sequence-generator-model</name>
+ <packaging>bundle</packaging>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Import-Package>*</Import-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-maven-plugin</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>maven-sal-api-gen-plugin</artifactId>
+ <!--<version>${odl.yangtools.version}</version> -->
+ <version>${odl.sal.api.gen.plugin.version}</version>
+ <type>jar</type>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <goals>
+ <goal>generate-sources</goal>
+ </goals>
+ <configuration>
+ <yangFilesRootDir>${yang.file.directory}</yangFilesRootDir>
+ <codeGenerators>
+ <generator>
+ <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+ <outputBaseDir>${salGeneratorPath}</outputBaseDir>
+ </generator>
+ </codeGenerators>
+ <inspectDependencies>true</inspectDependencies>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal</groupId>
+ <artifactId>yang-binding</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal.model</groupId>
+ <artifactId>ietf-inet-types</artifactId>
+ <version>${odl.ietf-inet-types.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.mdsal.model</groupId>
+ <artifactId>ietf-yang-types</artifactId>
+ <version>${odl.ietf-yang-types.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/appc-sequence-generator/appc-sequence-generator-model/src/main/yang/sequence-generator.yang b/appc-sequence-generator/appc-sequence-generator-model/src/main/yang/sequence-generator.yang
new file mode 100644
index 0000000..6777dad
--- /dev/null
+++ b/appc-sequence-generator/appc-sequence-generator-model/src/main/yang/sequence-generator.yang
@@ -0,0 +1,223 @@
+module sequence-generator {
+ yang-version 1;
+
+ namespace "org:openecomp:appc:sequencegenerator";
+ prefix sequencegenerator;
+
+ description
+ "Defines sequence generator api interface for App-C services";
+
+ revision "2017-07-06" {
+ description
+ "Initial draft";
+ }
+
+ grouping request-info {
+ container request-info{
+ leaf action {
+ type enumeration {
+ enum "Start";
+ enum "Stop";
+ }
+ }
+ leaf action-level {
+ type enumeration {
+ enum "vm";
+ enum "vnfc";
+ enum "vnf";
+ enum "vf-module";
+ }
+ }
+ container action-identifier {
+ leaf vnf-id {
+ description "identifies the VNF to which this action is to be applied(vnf-id uniquely identifies the service-instance referred to).";
+ type string;
+ }
+ leaf vnfc-name {
+ type string;
+ }
+ leaf vserver-id {
+ type string;
+ }
+ }
+ leaf payload {
+ description "An action-specific value opaque to the APPC handler.
+ The value can be any valid JSON type (primitive, object, collection of those two).
+ APPC will pass the value as raw JSON string";
+ type string;
+ }
+ }
+ }
+
+ grouping inventory-info {
+ container inventory-info {
+ container vnf-info {
+ leaf vnf-id {
+ type string;
+ }
+ leaf vnf-name {
+ type string;
+ }
+ leaf vnf-type {
+ type string;
+ }
+ list vm {
+ key "vserver-id";
+ leaf vserver-id {
+ type string;
+ }
+ container vnfc {
+ leaf vnfc-type {
+ type string;
+ }
+ leaf vnfc-name {
+ type string;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ grouping dependency-info {
+ container dependency-info {
+ list vnfcs {
+ leaf vnfc-type {
+ type string;
+ }
+ leaf mandatory {
+ type boolean;
+ }
+ leaf resilience {
+ type string;
+ }
+ leaf-list parents {
+ type string;
+ }
+ }
+ }
+ }
+
+ grouping tunable-parameters {
+ container tunable-parameters {
+ leaf strategy {
+ type enumeration {
+ enum "FORWARD";
+ enum "REVERSE";
+ }
+ }
+ leaf wait-time {
+ type uint16;
+ }
+ leaf retry-count {
+ type uint16;
+ }
+ }
+ }
+
+ grouping capabilities {
+ container capabilities {
+ leaf-list vnf {
+ type string;
+ }
+ leaf-list vf-module {
+ type string;
+ }
+ leaf-list vm {
+ type string;
+ }
+ leaf-list vnfc {
+ type string;
+ }
+ }
+ }
+
+ grouping response {
+ container status {
+ leaf code {
+ type uint16;
+ }
+ leaf message {
+ type string;
+ }
+ }
+ list transactions{
+ key "transaction-id";
+ leaf transaction-id{
+ type uint16;
+ }
+ leaf action{
+ type string;
+ }
+ leaf action-level{
+ type string;
+ }
+ container action-identifier{
+ leaf vserver-id {
+ type string;
+ }
+ leaf vnfc-name {
+ type string;
+ }
+ leaf vnf-id {
+ type string;
+ }
+ }
+ leaf payload{
+ type string;
+ }
+ leaf precheck-operator{
+ type string;
+ }
+ list precheck-options{
+ leaf pre-transaction-id{
+ type uint16;
+ }
+ leaf param-name{
+ type string;
+ }
+ leaf param-value{
+ type string;
+ }
+ leaf rule{
+ type string;
+ }
+ }
+ list responses{
+ leaf response-message{
+ type string;
+ }
+ container response-action{
+ leaf wait{
+ type uint16;
+ }
+ leaf retry{
+ type uint16;
+ }
+ leaf continue{
+ type boolean;
+ }
+ leaf stop{
+ type boolean;
+ }
+ leaf ignore{
+ type boolean;
+ }
+ }
+ }
+ }
+ }
+
+ rpc generate-sequence {
+ input{
+ uses request-info;
+ uses inventory-info;
+ uses dependency-info;
+ uses tunable-parameters;
+ uses capabilities;
+ }
+ output{
+ uses response;
+ }
+ }
+ }
\ No newline at end of file
diff --git a/appc-sequence-generator/pom.xml b/appc-sequence-generator/pom.xml
new file mode 100644
index 0000000..55b4c14
--- /dev/null
+++ b/appc-sequence-generator/pom.xml
@@ -0,0 +1,46 @@
+<?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</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator</artifactId>
+ <name>appc-sequence-generator</name>
+ <packaging>pom</packaging>
+
+
+ <properties>
+ <bundle.plugin.version>2.5.0</bundle.plugin.version>
+ <feature-name>appc-sequence-generator</feature-name>
+ </properties>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-features</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-sequence-generator-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <modules>
+ <module>appc-sequence-generator-model</module>
+ <module>appc-sequence-generator-bundle</module>
+ <module>appc-sequence-generator-features</module>
+ <module>appc-sequence-generator-installer</module>
+ </modules>
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 638a50d..e0914db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -555,6 +555,11 @@
<goal>update-file-header</goal>
</goals>
<phase>process-sources</phase>
+ <configuration>
+ <excludes>
+ <exclude>*.json</exclude>
+ </excludes>
+ </configuration>
</execution>
</executions>
</plugin>
@@ -641,6 +646,7 @@
<module>appc-directed-graph</module>
<module>appc-outbound</module>
<module>appc-inbound</module>
+ <module>appc-sequence-generator</module>
</modules>
</profile>
<profile>