Initial OpenECOMP APPC commit
Change-Id: Ifc3647aec40c0507d260ccc041c10a2aa1441c74
Signed-off-by: Patrick Brady <pb071s@att.com>
diff --git a/app-c/appc/appc-dg/.gitignore b/app-c/appc/appc-dg/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/README.txt b/app-c/appc/appc-dg/appc-dg-shared/README.txt
new file mode 100644
index 0000000..960d518
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/README.txt
@@ -0,0 +1 @@
+This project contains set of DG-ready reusable APP-C utility classes, such as utility for executing a command on remote machine via SSH and more.
\ No newline at end of file
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/pom.xml
new file mode 100644
index 0000000..a1bdfbf
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/pom.xml
@@ -0,0 +1,85 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-aai</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-common</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.adaptors</groupId>
+ <artifactId>aai-service-provider</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-dg-aai</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.appc.dg.aai</Export-Package>
+ <Private-Package>org.openecomp.appc.dg.aai.impl.*</Private-Package>
+ <Import-Package>
+ !org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*
+ </Import-Package>
+ <Embed-Dependency>
+ appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false
+ </Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/AAIPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/AAIPlugin.java
new file mode 100644
index 0000000..e220182
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/AAIPlugin.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.aai;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+public interface AAIPlugin extends SvcLogicJavaPlugin {
+ void postGenericVnfData(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+
+ void getGenericVnfData(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/AAIPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/AAIPluginImpl.java
new file mode 100644
index 0000000..6eae559
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/AAIPluginImpl.java
@@ -0,0 +1,122 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.aai.impl;
+
+import org.openecomp.appc.dg.aai.AAIPlugin;
+import org.openecomp.appc.dg.aai.impl.Constants;
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicResource;
+import org.openecomp.sdnc.sli.aai.AAIClient;
+import org.openecomp.sdnc.sli.aai.AAIService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class AAIPluginImpl implements AAIPlugin {
+ private AAIClient aaiClient;
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(AAIPluginImpl.class);
+
+ public AAIPluginImpl() {
+ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ ServiceReference sref = bctx.getServiceReference(AAIService.class);
+ aaiClient = (AAIClient) bctx.getService(sref);
+ }
+
+ @Override
+ public void postGenericVnfData(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ String vnf_id = ctx.getAttribute(Constants.VNF_ID_PARAM_NAME);
+ String prefix = ctx.getAttribute(Constants.AAI_PREFIX_PARAM_NAME);
+
+ String key = "vnf-id = '" + vnf_id + "'";
+
+ Map<String, String> data = new HashMap<>();
+ for (Map.Entry<String, String> entry : params.entrySet()) {
+ String paramKey = entry.getKey();
+ int pos = paramKey.indexOf(Constants.AAI_INPUT_DATA);
+ if (pos == 0) {
+ data.put(paramKey.substring(Constants.AAI_INPUT_DATA.length()+1), entry.getValue());
+ }
+ }
+
+ try {
+ SvcLogicResource.QueryStatus response = aaiClient.update("generic-vnf", key, data, prefix, ctx);
+ if (SvcLogicResource.QueryStatus.NOT_FOUND.equals(response)) {
+ String errorMessage = String.format("VNF not found for vnf_id = %s", vnf_id);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ throw new APPCException(errorMessage);
+ }
+ logger.info("AAIResponse: " + response.toString());
+ if (SvcLogicResource.QueryStatus.FAILURE.equals(response)) {
+ String errorMessage = String.format("Error Querying AAI with vnfID = %s", vnf_id);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ throw new APPCException(errorMessage);
+ }
+ } catch (SvcLogicException e) {
+ String errorMessage = String.format("Error in postVnfdata %s", e);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ logger.error(errorMessage);
+ throw new APPCException(e);
+ }
+ }
+
+ @Override
+ public void getGenericVnfData(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ String vnf_id = ctx.getAttribute(Constants.VNF_ID_PARAM_NAME);
+ String prefix = ctx.getAttribute(Constants.AAI_PREFIX_PARAM_NAME);
+
+ String key = "vnf-id = '" + vnf_id + "'";
+ try {
+ SvcLogicResource.QueryStatus response = aaiClient.query("generic-vnf", false, null, key, prefix, null, ctx);
+ if (SvcLogicResource.QueryStatus.NOT_FOUND.equals(response)) {
+ String errorMessage = String.format("VNF not found for vnf_id = %s", vnf_id);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ throw new APPCException(errorMessage);
+ } else if (SvcLogicResource.QueryStatus.FAILURE.equals(response)) {
+ String errorMessage = String.format("Error Querying AAI with vnfID = %s", vnf_id);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ throw new APPCException(errorMessage);
+ }
+ String aaiEntitlementPoolUuid = ctx.getAttribute(Constants.AAI_ENTITLMENT_POOL_UUID_NAME);
+ if (null == aaiEntitlementPoolUuid) aaiEntitlementPoolUuid = "";
+ String aaiLicenseKeyGroupUuid = ctx.getAttribute(Constants.AAI_LICENSE_KEY_UUID_NAME);
+ if (null == aaiLicenseKeyGroupUuid) aaiLicenseKeyGroupUuid = "";
+
+ ctx.setAttribute(Constants.IS_RELEASE_ENTITLEMENT_REQUIRE, Boolean.toString(!aaiEntitlementPoolUuid.isEmpty()));
+ ctx.setAttribute(Constants.IS_RELEASE_LICENSE_REQUIRE, Boolean.toString(!aaiLicenseKeyGroupUuid.isEmpty()));
+
+ logger.info("AAIResponse: " + response.toString());
+ } catch (SvcLogicException e) {
+ String errorMessage = String.format("Error in getVnfdata %s", e);
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, errorMessage);
+ logger.error(errorMessage);
+ throw new APPCException(e);
+ }
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/Constants.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/Constants.java
new file mode 100644
index 0000000..3feab47
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/java/org/openecomp/appc/dg/aai/impl/Constants.java
@@ -0,0 +1,112 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.aai.impl;
+
+
+public class Constants {
+ public final static String VNF_ID_PARAM_NAME = "aai.vnfID";
+ public static final String AAI_PREFIX_PARAM_NAME = "aai.prefix";
+ public static final String AAI_INPUT_DATA = "aai.input.data";
+ public static final String AAI_ERROR_MESSAGE = "org.openecomp.appc.dg.error";
+
+ public static final String CONFIGURE_PATH = "/restconf/config/opendaylight-inventory:nodes/node/";
+ public static final String CONNECT_PATH = "/restconf/config/opendaylight-inventory:nodes/node/controller-config/yang-ext:mount/config:modules";
+ public static final String CHECK_CONNECTION_PATH = "/restconf/operational/opendaylight-inventory:nodes/node/";
+ public static final String DISCONNECT_PATH = "/restconf/config/opendaylight-inventory:nodes/node/controller-config/yang-ext:mount/config:modules/module/odl-sal-netconf-connector-cfg:sal-netconf-connector/";
+
+ public static final String CONTROLLER_IP = "127.0.0.1";
+ public static final int CONTROLLER_PORT = 8181;
+ public static final String PROTOCOL = "http";
+
+ public static final String VF_LICENSE = "VF_LICENSE";
+
+ // tables and fields
+ public static final String NETCONF_SCHEMA = "sdnctl";
+ public static final String SDNCTL_SCHEMA = "sdnctl";
+ public static final String DEVICE_AUTHENTICATION_TABLE_NAME = "DEVICE_AUTHENTICATION";
+ public static final String CONFIGFILES_TABLE_NAME = "CONFIGFILES";
+ public static final String DEVICE_INTERFACE_LOG_TABLE_NAME = "DEVICE_INTERFACE_LOG";
+ public static final String FILE_CONTENT_TABLE_FIELD_NAME = "FILE_CONTENT";
+ public static final String FILE_NAME_TABLE_FIELD_NAME = "FILE_NAME";
+ public static final String USER_NAME_TABLE_FIELD_NAME = "USER_NAME";
+ public static final String PASSWORD_TABLE_FIELD_NAME = "PASSWORD";
+ public static final String PORT_NUMBER_TABLE_FIELD_NAME = "PORT_NUMBER";
+ public static final String VNF_TYPE_TABLE_FIELD_NAME = "VNF_TYPE";
+ public static final String SERVICE_INSTANCE_ID_FIELD_NAME = "SERVICE_INSTANCE_ID";
+ public static final String REQUEST_ID_FIELD_NAME = "REQUEST_ID";
+ public static final String CREATION_DATE_FIELD_NAME = "CREATION_DATE";
+ public static final String LOG_FIELD_NAME = "LOG";
+ public static final String ASDC_ARTIFACTS_TABLE_NAME = "ASDC_ARTIFACTS";
+
+ // input fields names
+ public static final String PAYLOAD = "payload";
+
+ // constants fo DG
+ public static final String VNF_TYPE_FIELD_NAME = "org.openecomp.appc.vftype";
+ public static final String VNF_VERSION_FIELD_NAME = "org.openecomp.appc.vfversion";
+ public static final String VNF_RESOURCE_VERSION_FIELD_NAME = "org.openecomp.appc.resource-version";
+ public static final String TARGET_VNF_TYPE = "target-vnf-type";
+ public static final String FILE_CONTENT_FIELD_NAME = "file-content";
+ public static final String CONNECTION_DETAILS_FIELD_NAME = "connection-details";
+ public static final String CONFIGURATION_FILE_FIELD_NAME = "configuration-file-name";
+ public static final String VNF_HOST_IP_ADDRESS_FIELD_NAME = "vnf-host-ip-address";
+ public static final String UPGRADE_VERSION = "upgrade-version";
+ public static final String DG_ERROR_FIELD_NAME = "org.openecomp.appc.dg.error";
+ public static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+ public static final String RESOURCEKEY = "resourceKey";
+ public static final String REQ_ID_FIELD_NAME = "org.openecomp.appc.reqid";
+ public static final String API_VERSION_FIELD_NAME = "org.openecomp.appc.apiversion";
+ public static final String MODEL_ENTITLMENT_POOL_UUID_NAME = "model.entitlement.pool.uuid";
+ public static final String MODEL_LICENSE_KEY_UUID_NAME = "model.license.key.uuid";
+ public static final String ENTITLMENT_POOL_UUID_NAME = "entitlement.pool.uuid";
+ public static final String LICENSE_KEY_UUID_NAME = "license.key.uuid";
+ public static final String IS_ACQUIRE_LICENSE_REQUIRE ="is.acquire-license.require";
+ public static final String IS_RELEASE_LICENSE_REQUIRE ="is.release-license.require";
+
+ public static final String AAI_ENTITLMENT_POOL_UUID_NAME = "aai.input.data.entitlement-assignment-group-uuid";
+ public static final String AAI_LICENSE_KEY_UUID_NAME = "aai.input.data.license-assignment-group-uuid";
+ public static final String AAI_LICENSE_KEY_VALUE = "aai.input.data.license-key";
+ public static final String IS_AAI_ENTITLEMENT_UPDATE_REQUIRE = "is.aai-entitlement-update.require";
+ public static final String IS_AAI_LICENSE_UPDATE_REQUIRE = "is.aai-license-update.require";
+ public static final String IS_ACQUIRE_ENTITLEMENT_REQUIRE ="is.acquire-entitlement.require";
+ public static final String IS_RELEASE_ENTITLEMENT_REQUIRE ="is.release-entitlement.require";
+
+ public enum ASDC_ARTIFACTS_FIELDS {
+ SERVICE_UUID,
+ DISTRIBUTION_ID,
+ SERVICE_NAME,
+ SERVICE_DESCRIPTION,
+ RESOURCE_UUID,
+ RESOURCE_INSTANCE_NAME,
+ RESOURCE_NAME,
+ RESOURCE_VERSION,
+ RESOURCE_TYPE,
+ ARTIFACT_UUID,
+ ARTIFACT_TYPE,
+ ARTIFACT_VERSION,
+ ARTIFACT_DESCRIPTION,
+ INTERNAL_VERSION,
+ CREATION_DATE,
+ ARTIFACT_NAME,
+ ARTIFACT_CONTENT
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..260b218
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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">
+
+ <service id="aaiServicePlugin" interface="org.openecomp.appc.dg.aai.AAIPlugin">
+ <bean class="org.openecomp.appc.dg.aai.impl.AAIPluginImpl"/>
+ </service>
+
+</blueprint>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIClientMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIClientMock.java
new file mode 100644
index 0000000..fc4379d
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIClientMock.java
@@ -0,0 +1,544 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.aai.impl;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicException;
+import org.openecomp.sdnc.sli.SvcLogicResource;
+import org.openecomp.sdnc.sli.aai.AAIClient;
+import org.openecomp.sdnc.sli.aai.AAIServiceException;
+import org.openecomp.sdnc.sli.aai.data.*;
+import org.openecomp.sdnc.sli.aai.data.notify.NotifyEvent;
+import org.openecomp.sdnc.sli.aai.data.v1507.VServer;
+import org.openecomp.sdnc.sli.aai.update.Update;
+
+
+public class AAIClientMock implements AAIClient {
+
+ Map<String, String> mockAAI = new HashMap<>();
+
+ public void setMockAAI(Map<String, String> mockAAI) {
+ this.mockAAI = mockAAI;
+ }
+
+ @Override
+ public AAIResponse requestSdnZoneQuery(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postNetworkVceData(String s, Vce vce) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public Vce requestNetworkVceData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean deleteNetworkVceData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public ServiceInstance requestServiceInterfaceData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public ServiceInstance requestServiceInterfaceData(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postServiceInterfaceData(String s, String s1, String s2, ServiceInstance serviceInstance) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public SearchResults requestServiceInstanceURL(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public Vpe requestNetworkVpeData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postNetworkVpeData(String s, Vpe vpe) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteNetworkVpeData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public Vserver requestVServerData(String s, String s1, String s2, String s3) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postVServerData(String s, String s1, String s2, String s3, Vserver vserver) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteVServerData(String s, String s1, String s2, String s3, String s4) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public URL requestVserverURLNodeQuery(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public String getTenantIdFromVserverUrl(URL url) {
+ return null;
+ }
+
+ @Override
+ public String getCloudOwnerFromVserverUrl(URL url) {
+ return null;
+ }
+
+ @Override
+ public String getCloudRegionFromVserverUrl(URL url) {
+ return null;
+ }
+
+ @Override
+ public String getVServerIdFromVserverUrl(URL url, String s) {
+ return null;
+ }
+
+ @Override
+ public Vserver requestVServerDataByURL(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public VplsPe requestNetworkVplsPeData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postNetworkVplsPeData(String s, VplsPe vplsPe) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteNetworkVplsPeData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public Complex requestNetworkComplexData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postNetworkComplexData(String s, Complex complex) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteNetworkComplexData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public CtagPool requestCtagPoolData(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public VServer dataChangeRequestVServerData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public CtagPool dataChangeRequestCtagPoolData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public VplsPe dataChangeRequestVplsPeData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public Vpe dataChangeRequestVpeData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public DvsSwitch dataChangeRequestDvsSwitchData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public PServer dataChangeRequestPServerData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public OamNetwork dataChangeRequestOAMNetworkData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public AvailabilityZone dataChangeRequestAvailabilityZoneData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public Complex dataChangeRequestComplexData(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean dataChangeDeleteVServerData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteCtagPoolData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteVplsPeData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteVpeData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteDvsSwitchData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteOAMNetworkData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteAvailabilityZoneData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean dataChangeDeleteComplexData(URL url) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public GenericVnf requestGenericVnfData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postGenericVnfData(String s, GenericVnf genericVnf) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteGenericVnfData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public DvsSwitch requestDvsSwitchData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postDvsSwitchData(String s, DvsSwitch dvsSwitch) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteDvsSwitchData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public PInterface requestPInterfaceData(String s, String s1) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postPInterfaceData(String s, String s1, PInterface pInterface) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deletePInterfaceData(String s, String s1, String s2) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public PhysicalLink requestPhysicalLinkData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postPhysicalLinkData(String s, PhysicalLink physicalLink) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deletePhysicalLinkData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public PServer requestPServerData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postPServerData(String s, PServer pServer) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deletePServerData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public L3Network requestL3NetworkData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public L3Network requestL3NetworkQueryByName(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postL3NetworkData(String s, L3Network l3Network) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteL3NetworkData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public VpnBinding requestVpnBindingData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean deleteVpnBindingData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public VnfImage requestVnfImageData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public VnfImage requestVnfImageDataByVendorModel(String s, String s1) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public VnfImage requestVnfImageDataByVendorModelVersion(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean sendNotify(NotifyEvent notifyEvent, String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public SitePairSet requestSitePairSetData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postSitePairSetData(String s, SitePairSet sitePairSet) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteSitePairSetData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public Service requestServiceData(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postServiceData(String s, Service service) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean deleteServiceData(String s, String s1) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public QueryResponse requestNodeQuery(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public String requestDataByURL(URL url) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public GenericVnf requestGenericVnfeNodeQuery(String s) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public Tenant requestTenantData(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public Tenant requestTenantDataByName(String s, String s1, String s2) throws AAIServiceException {
+ return null;
+ }
+
+ @Override
+ public boolean postTenantData(String s, String s1, String s2, Tenant tenant) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public boolean updateAnAIEntry(Update update) throws AAIServiceException {
+ return false;
+ }
+
+ @Override
+ public QueryStatus backup(Map<String, String> map, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus restore(Map<String, String> map, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus isAvailable(String s, String s1, String s2, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus exists(String s, String s1, String s2, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus query(String s, boolean b, String s1, String key, String prefix, String s4, SvcLogicContext ctx) throws SvcLogicException {
+ if (s.equals("generic-vnf") && key.equals("vnf-id = 'test_VNF'") && ctx != null) {
+ for (Map.Entry<String, String> entry : mockAAI.entrySet()) {
+ ctx.setAttribute(prefix + "." + entry.getKey(), entry.getValue());
+ }
+ return QueryStatus.SUCCESS;
+
+
+ } else if (key.equals("vnf-id = 'test_VNF1'")){
+ return QueryStatus.NOT_FOUND;
+ }
+ else if (key.equals("vnf-id = 'test_VNF3'")){
+ throw new SvcLogicException();
+ }
+ else {
+ return QueryStatus.FAILURE;
+ }
+
+
+ }
+
+ @Override
+ public QueryStatus reserve(String s, String s1, String s2, String s3, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus save(String s, boolean b, boolean b1, String s1, Map<String, String> map, String s2, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus release(String s, String s1, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus delete(String s, String s1, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus notify(String s, String s1, SvcLogicContext svcLogicContext) throws SvcLogicException {
+ return null;
+ }
+
+ @Override
+ public QueryStatus update(String s, String key, Map<String, String> data, String prefix, SvcLogicContext ctx) throws SvcLogicException {
+ if (s.equals("generic-vnf") && key.equals("vnf-id = 'test_VNF'") && ctx != null) {
+ for (Map.Entry<String, String> entry : data.entrySet()) {
+ mockAAI.put(entry.getKey(), entry.getValue());
+ }
+ return QueryStatus.SUCCESS;
+
+
+ } else if (key.equals("vnf-id = 'test_VNF1'")){
+ return QueryStatus.NOT_FOUND;
+ }
+ else if (key.equals("vnf-id = 'test_VNF3'")){
+ throw new SvcLogicException();
+ }
+ else {
+ return QueryStatus.FAILURE;
+ }
+
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIPluginImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIPluginImplTest.java
new file mode 100644
index 0000000..8d6fea0
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-aai/src/main/test/java/org/openecomp/appc/dg/aai/impl/AAIPluginImplTest.java
@@ -0,0 +1,260 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.aai.impl;
+
+import org.junit.*;
+import org.junit.runner.RunWith;
+import org.mockito.*;
+import org.openecomp.appc.dg.aai.Constants;
+import org.openecomp.appc.dg.aai.impl.AAIPluginImpl;
+import org.openecomp.appc.dg.common.dao.DAOService;
+import org.openecomp.appc.dg.common.impl.LicenseManagerImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicResource;
+import org.openecomp.sdnc.sli.aai.AAIClient;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+import static org.powermock.api.support.SuppressCode.suppressConstructor;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({AAIPluginImpl.class, FrameworkUtil.class})
+public class AAIPluginImplTest {
+ private AAIPluginImpl aaiPlugin;
+ private AAIClientMock aaiClient;
+
+ private final BundleContext bundleContext= Mockito.mock(BundleContext.class);
+ private final Bundle bundleService=Mockito.mock(Bundle.class);
+ private final ServiceReference sref=Mockito.mock(ServiceReference.class);
+
+ String prefix = "aai.input.data";
+ String vnfId = "test_VNF";
+ String vnfId1 = "test_VNF1";
+ String vnfId2 = "test_VNF2";
+ String vnfId3 = "test_VNF3";
+
+ @Before
+ public void setUp() throws NoSuchFieldException, IllegalAccessException {
+ aaiClient = new AAIClientMock();
+ PowerMockito.mockStatic(FrameworkUtil.class);
+ PowerMockito.when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService);
+ PowerMockito.when(bundleService.getBundleContext()).thenReturn(bundleContext);
+ PowerMockito.when(bundleContext.getServiceReference(Matchers.any(Class.class))).thenReturn(sref);
+ PowerMockito.when(bundleContext.getService(sref)).thenReturn(aaiClient);
+ aaiPlugin = new AAIPluginImpl();
+
+
+ }
+
+
+
+
+ @Test
+ public void testPostGenericVnfData() throws Exception {
+ Map<String, String> params = new HashMap<>();
+ params.put(prefix+"."+"license-key-uuid", "123");
+ params.put(prefix+"."+"license-assignment-group-uuid", "1234");
+ params.put(prefix+"."+"data.license-key", "12345");
+
+ HashMap<String, String> mockAAI = new HashMap<>();
+ aaiClient.setMockAAI(mockAAI);
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ aaiPlugin.postGenericVnfData(params, ctx);
+
+ Assert.assertEquals("wrong license-key-uuid","123", mockAAI.get("license-key-uuid"));
+ Assert.assertEquals("wrong license-assignment-group-uuid","1234", mockAAI.get("license-assignment-group-uuid"));
+ Assert.assertEquals("wrong data.license-key","12345", mockAAI.get("data.license-key"));
+ }
+
+
+ @Test
+ public void testPostGenericVnfDataNegativeVnfNotFound() throws Exception {
+ Map<String, String> params = new HashMap<>();
+ params.put(prefix+"."+"license-key-uuid", "123");
+ params.put(prefix+"."+"license-assignment-group-uuid", "1234");
+ params.put(prefix+"."+"data.license-key", "12345");
+
+ HashMap<String, String> mockAAI = new HashMap<>();
+
+ aaiClient.setMockAAI(mockAAI);
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId1);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ try {
+ aaiPlugin.postGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+ }
+
+
+ @Test
+ public void testPostGenericVnfDataNegativeFailure() throws Exception {
+ Map<String, String> params = new HashMap<>();
+ params.put(prefix+"."+"license-key-uuid", "123");
+ params.put(prefix+"."+"license-assignment-group-uuid", "1234");
+ params.put(prefix+"."+"data.license-key", "12345");
+
+ HashMap<String, String> mockAAI = new HashMap<>();
+
+ aaiClient.setMockAAI(mockAAI);
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId2);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ try {
+ aaiPlugin.postGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+ }
+
+
+ @Test
+ public void testPostGenericVnfDataNegativeSvcLogicException() throws Exception {
+ Map<String, String> params = new HashMap<>();
+ params.put(prefix+"."+"license-key-uuid", "123");
+ params.put(prefix+"."+"license-assignment-group-uuid", "1234");
+ params.put(prefix+"."+"data.license-key", "12345");
+
+ HashMap<String, String> mockAAI = new HashMap<>();
+
+ aaiClient.setMockAAI(mockAAI);
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId3);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ try {
+ aaiPlugin.postGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+ }
+
+ @Test
+ public void testGetGenericVnfData() throws Exception {
+ String vnfNameKey = "vnf-name";
+ String vnfType = "VSCP";
+ String vnfTypeKey = "vnf-type";
+ String provStatus = "Active";
+ String provStatusKey = "prov-status";
+ String orchestrationStatus = "Running";
+ String orchestrationStatusKey = "orchestration-status";
+
+ Map<String, String> params = new HashMap<>();
+ HashMap<String, String> mockAAI = new HashMap<>();
+ mockAAI.put(vnfNameKey,vnfId);
+ mockAAI.put(vnfTypeKey,vnfType);
+ mockAAI.put(provStatusKey, provStatus);
+ mockAAI.put(orchestrationStatusKey, orchestrationStatus);
+ aaiClient.setMockAAI(mockAAI);
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId);
+ ctx.setAttribute("aai.prefix", prefix);
+
+
+ aaiPlugin.getGenericVnfData(params, ctx);
+
+ Assert.assertEquals("wrong "+vnfNameKey,vnfId, ctx.getAttribute(prefix + "." + vnfNameKey));
+ Assert.assertEquals("wrong "+orchestrationStatusKey,orchestrationStatus, ctx.getAttribute(prefix + "." + orchestrationStatusKey));
+ Assert.assertEquals("wrong "+vnfTypeKey,vnfType, ctx.getAttribute(prefix + "." + vnfTypeKey));
+ Assert.assertEquals("wrong "+provStatusKey,provStatus, ctx.getAttribute(prefix + "." + provStatusKey ));
+ }
+
+
+
+
+ @Test
+ public void testGetGenericVnfDataNegativeVnfNotFound() throws Exception {
+
+ Map<String, String> params = new HashMap<>();
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId1);
+ ctx.setAttribute("aai.prefix", prefix);
+
+
+ try {
+ aaiPlugin.getGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+ }
+
+
+ @Test
+ public void testGetGenericVnfDataNegativeFailure() throws Exception {
+
+ Map<String, String> params = new HashMap<>();
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId2);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ try {
+ aaiPlugin.getGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+ }
+
+
+ @Test
+ public void testGetGenericVnfDataNegativeSvcLogicException() throws Exception {
+
+ Map<String, String> params = new HashMap<>();
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("aai.vnfID", vnfId3);
+ ctx.setAttribute("aai.prefix", prefix);
+
+ try {
+ aaiPlugin.getGenericVnfData(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE));
+ }
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/pom.xml
new file mode 100644
index 0000000..e41a3cb
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/pom.xml
@@ -0,0 +1,81 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-common</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dmaap-adapter-bundle</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-easymock</artifactId>
+ <version>1.6.2</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-dg-common</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.appc.dg.common,org.openecomp.appc.dg.common.objects,org.openecomp.appc.dg.common.utils</Export-Package>
+ <Private-Package>org.openecomp.appc.dg.common.impl.*</Private-Package>
+ <Import-Package>!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package>
+ <Embed-Dependency>appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/DCAEReporterPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/DCAEReporterPlugin.java
new file mode 100644
index 0000000..a990380
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/DCAEReporterPlugin.java
@@ -0,0 +1,34 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+public interface DCAEReporterPlugin extends SvcLogicJavaPlugin {
+ void report(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void reportSuccess(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/JsonDgUtil.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/JsonDgUtil.java
new file mode 100644
index 0000000..2b3fbf7
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/JsonDgUtil.java
@@ -0,0 +1,33 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+public interface JsonDgUtil extends SvcLogicJavaPlugin {
+ void flatAndAddToContext(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/LegacyUtil.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/LegacyUtil.java
new file mode 100644
index 0000000..a356a15
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/LegacyUtil.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+
+public interface LegacyUtil extends SvcLogicJavaPlugin {
+
+ void prepareRequest(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+
+ void convertPositiveResponse(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+
+ void convertNegativeResponse(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/Constants.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/Constants.java
new file mode 100644
index 0000000..92d23e3
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/Constants.java
@@ -0,0 +1,57 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+
+
+class Constants {
+
+ public static final String DG_ERROR_FIELD_NAME = "org.openecomp.appc.dg.error";
+ public static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+ public static final String API_VERSION_FIELD_NAME = "org.openecomp.appc.apiversion";
+ public static final String REQ_ID_FIELD_NAME = "org.openecomp.appc.reqid";
+ public static final String PAYLOAD = "payload";
+
+ enum LegacyAttributes {
+ Action("org.openecomp.appc.action"),
+ VMID("org.openecomp.appc.vmid"),
+ IdentityURL("org.openecomp.appc.identity.url"),
+ TenantID("org.openecomp.appc.tenant.id");
+
+ private String value;
+ LegacyAttributes(String value) {this.value = value;}
+ String getValue() {return value;}
+ };
+
+ enum LCMAttributes {
+ Action("input.action"),
+ Payload("input.payload"),
+ VMID("vm-id"),
+ IdentityURL("identity-url"),
+ TenantID("tenant.id");
+
+ private String value;
+ LCMAttributes(String value) {this.value = value;}
+ String getValue() {return value;}
+ };
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImpl.java
new file mode 100644
index 0000000..4458de1
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImpl.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.adapter.dmaap.EventSender;
+import org.openecomp.appc.adapter.dmaap.DmaapDestination;
+import org.openecomp.appc.adapter.dmaap.event.EventHeader;
+import org.openecomp.appc.adapter.dmaap.event.EventMessage;
+import org.openecomp.appc.adapter.dmaap.event.EventStatus;
+import org.openecomp.appc.dg.common.DCAEReporterPlugin;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+import java.util.Map;
+
+public class DCAEReporterPluginImpl implements DCAEReporterPlugin {
+
+ private EventSender eventSender;
+
+ public DCAEReporterPluginImpl() {
+ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ ServiceReference sref = bctx.getServiceReference(EventSender.class);
+ eventSender = (EventSender) bctx.getService(sref);
+ }
+
+ @Override
+ public void report(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ Integer errorReportCode = 501;
+ boolean bwcMode = Boolean.parseBoolean(ctx.getAttribute("isBwcMode"));
+ String errorDescription,apiVersion,eventId ;
+ errorDescription = getErrorDescriptionAndAddToCtx(bwcMode,params,ctx);
+ if(!bwcMode){
+ apiVersion = ctx.getAttribute("input.common-header.api-ver");
+ eventId = ctx.getAttribute("input.common-header.request-id");
+ }else {
+ apiVersion = ctx.getAttribute(Constants.API_VERSION_FIELD_NAME);
+ eventId = ctx.getAttribute(Constants.REQ_ID_FIELD_NAME);
+ }
+
+ EventMessage eventMessage = new EventMessage(new EventHeader((new java.util.Date()).toString(), apiVersion, eventId), new EventStatus(errorReportCode, errorDescription));
+ eventSender.sendEvent(DmaapDestination.DCAE, eventMessage);
+ }
+
+ private String getErrorDescriptionAndAddToCtx(boolean bwcMode, Map<String, String> params, SvcLogicContext ctx) {
+ String errorDescription;
+ if(!bwcMode) {
+ errorDescription = params.get(Constants.DG_OUTPUT_STATUS_MESSAGE);
+ if(StringUtils.isEmpty(errorDescription)) {
+ errorDescription = ctx.getAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE);
+ }else {
+ addToContextIfNotContains(bwcMode,errorDescription,ctx);
+ }
+ }else{
+ errorDescription = params.get(Constants.DG_ERROR_FIELD_NAME);
+ if(StringUtils.isEmpty(errorDescription)) {
+ errorDescription = ctx.getAttribute("org.openecomp.appc.dg.error");
+ }else {
+ addToContextIfNotContains(bwcMode, errorDescription,ctx);
+ }
+ }
+
+ if(StringUtils.isEmpty(errorDescription)) {
+ errorDescription = "Unknown";
+ }
+ return errorDescription;
+ }
+
+ private void addToContextIfNotContains(boolean bwcMode, String errorDescription, SvcLogicContext ctx) {
+ String errorDescriptionFromCtx;
+ if(!StringUtils.isEmpty(errorDescription)) {
+ String outputStatusMessageProperty = bwcMode ? "org.openecomp.appc.dg.error" : Constants.DG_OUTPUT_STATUS_MESSAGE;
+ errorDescriptionFromCtx = ctx.getAttribute(outputStatusMessageProperty);
+ if(StringUtils.isEmpty(errorDescriptionFromCtx)){
+ ctx.setAttribute(outputStatusMessageProperty, errorDescription);
+ }else if (!errorDescriptionFromCtx.contains(errorDescription)){
+ ctx.setAttribute(outputStatusMessageProperty, errorDescriptionFromCtx+ " | "+ errorDescription);
+ }
+ }
+ }
+
+
+ @Override
+ public void reportSuccess(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ Integer successReportCode = 500;
+ String successDescription, apiVersion, eventId;
+ successDescription = params.get(Constants.DG_OUTPUT_STATUS_MESSAGE);
+ apiVersion = ctx.getAttribute("input.common-header.api-ver");
+ eventId = ctx.getAttribute("input.common-header.request-id");
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, successDescription);
+
+ if (null == successDescription) {
+ successDescription = "Success";
+ }
+ EventMessage eventMessage = new EventMessage(new EventHeader((new java.util.Date()).toString(), apiVersion, eventId), new EventStatus(successReportCode, successDescription));
+ eventSender.sendEvent(DmaapDestination.DCAE, eventMessage);
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImpl.java
new file mode 100644
index 0000000..9519113
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImpl.java
@@ -0,0 +1,66 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.dg.common.JsonDgUtil;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.util.JsonUtil;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.util.Map;
+
+
+public class JsonDgUtilImpl implements JsonDgUtil {
+ private static final EELFLogger logger = EELFManager.getInstance().getLogger(JsonDgUtilImpl.class);
+
+ @Override
+ public void flatAndAddToContext(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Entering to flatAndAddToContext with params = "+ ObjectUtils.toString(params)+", SvcLogicContext = "+ObjectUtils.toString(ctx));
+ }
+ try {
+ String paramName = Constants.PAYLOAD;
+ String payload = params.get(paramName);
+ if (payload == "")
+ payload = ctx.getAttribute("input.payload");
+ if (!StringUtils.isEmpty(payload)) {
+ Map<String, String> flatMap = JsonUtil.convertJsonStringToFlatMap(payload);
+ if (flatMap != null && flatMap.size() > 0) {
+ for (Map.Entry<String, String> entry : flatMap.entrySet()) {
+ ctx.setAttribute(entry.getKey(), entry.getValue());
+ }
+ }
+ } else {
+ logger.warn("input payload param value is empty (\"\") or null");
+ }
+ } catch (Exception e) {
+ logger.error(e.toString());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.toString());
+ throw new APPCException(e);
+ }
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/LegacyUtilImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/LegacyUtilImpl.java
new file mode 100644
index 0000000..6354b20
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/impl/LegacyUtilImpl.java
@@ -0,0 +1,55 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import java.util.Map;
+
+import org.openecomp.appc.dg.common.LegacyUtil;
+import org.openecomp.appc.dg.common.utils.JSONUtil;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+
+
+public class LegacyUtilImpl implements LegacyUtil {
+
+ @Override public void prepareRequest(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ ctx.setAttribute(Constants.LegacyAttributes.Action.getValue(), ctx.getAttribute(Constants.LCMAttributes.Action.getValue()).toLowerCase());
+
+ String payloadStr = ctx.getAttribute(Constants.LCMAttributes.Payload.getValue());
+ Map<String,String> payloads = JSONUtil.extractPlainValues(payloadStr,
+ Constants.LCMAttributes.VMID.getValue(), Constants.LCMAttributes.IdentityURL.getValue(), Constants.LCMAttributes.TenantID.getValue());
+
+ ctx.setAttribute(Constants.LegacyAttributes.VMID.getValue(), payloads.get(Constants.LCMAttributes.VMID.getValue()));
+ ctx.setAttribute(Constants.LegacyAttributes.IdentityURL.getValue(), payloads.get(Constants.LCMAttributes.IdentityURL.getValue()));
+ ctx.setAttribute(Constants.LegacyAttributes.TenantID.getValue(), payloads.get(Constants.LCMAttributes.TenantID.getValue()));
+
+ }
+
+ @Override
+ public void convertPositiveResponse(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ }
+
+ @Override
+ public void convertNegativeResponse(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/objects/ConnectionDetails.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/objects/ConnectionDetails.java
new file mode 100644
index 0000000..d576555
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/objects/ConnectionDetails.java
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.objects;
+
+
+
+public class ConnectionDetails {
+
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JAXBUtil.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JAXBUtil.java
new file mode 100644
index 0000000..a298e9c
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JAXBUtil.java
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.utils;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+
+
+public class JAXBUtil {
+
+ public static <T> T toObject(String xml, Class<T> type) throws JAXBException {
+
+ //create JAXB context
+ JAXBContext context = JAXBContext.newInstance(type);
+
+ //Create Unmarshaller using JAXB context
+ Unmarshaller unmarshaller = context.createUnmarshaller();
+
+ InputStream xmlInputStream = new ByteArrayInputStream(xml.getBytes());
+ BufferedReader reader = new BufferedReader(new InputStreamReader(xmlInputStream));
+
+ return type.cast(unmarshaller.unmarshal(reader));
+
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JSONUtil.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JSONUtil.java
new file mode 100644
index 0000000..fe71974
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/java/org/openecomp/appc/dg/common/utils/JSONUtil.java
@@ -0,0 +1,80 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.*;
+
+
+public class JSONUtil {
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ public static <T> T fromJson(String json, Class<T> clazz) {
+
+ try {
+ return OBJECT_MAPPER.readValue(json, clazz);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static <T> T fromJson(Reader reader, Class<T> clazz) {
+
+ try {
+ return OBJECT_MAPPER.readValue(reader, clazz);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static String toJson(Object object) {
+
+ try {
+ return OBJECT_MAPPER.writeValueAsString(object);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static Map<String,String> extractPlainValues(String json, String ... names) {
+ if (null == names) return Collections.emptyMap();
+ Map<String,String> values = new HashMap<>();
+ try {
+ final JsonNode jsonNode = OBJECT_MAPPER.readTree(json);
+ for (String name : names) {
+ values.put(name, jsonNode.path(name).asText());
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return values;
+ }
+
+
+
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..53b5367
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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=========================================================
+ -->
+
+<!--
+ Starter Blueprint Camel Definition appc-aai-adapter-blueprint
+-->
+<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="JsonDgUtilBean" class="org.openecomp.appc.dg.common.impl.JsonDgUtilImpl"/>
+ <service id="JsonDgUtil" interface="org.openecomp.appc.dg.common.JsonDgUtil" ref="JsonDgUtilBean"/>
+
+ <reference id="eventSenderRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.adapter.dmaap.EventSender" />
+
+ <bean id="DCAEReporterPluginBean" class="org.openecomp.appc.dg.common.impl.DCAEReporterPluginImpl" scope="singleton"/>
+ <service id="DCAEReporterPlugin" interface="org.openecomp.appc.dg.common.DCAEReporterPlugin" ref="DCAEReporterPluginBean"/>
+
+ <bean id="legacyUtilBean" class="org.openecomp.appc.dg.common.impl.LegacyUtilImpl" scope="singleton"/>
+ <service id="legacyUtil" interface="org.openecomp.appc.dg.common.LegacyUtil" ref="legacyUtilBean"/>
+
+</blueprint>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/org/openecomp/appc/default.properties b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/org/openecomp/appc/default.properties
new file mode 100644
index 0000000..d8451ee
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/org/openecomp/appc/default.properties
@@ -0,0 +1,47 @@
+###
+# ============LICENSE_START=======================================================
+# openECOMP : 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=========================================================
+###
+
+org.openecomp.appc.bootstrap.file=appc.properties
+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
+
+org.openecomp.appc.netconf.db.url.netconfctl=jdbc:mysql://127.0.0.1:3306/test
+org.openecomp.appc.netconf.db.user.netconfctl=test
+org.openecomp.appc.netconf.db.pass.netconfctl=123456
+
+org.openecomp.appc.db.url.sdnctl=jdbc:mysql://127.0.0.1:3306/test
+org.openecomp.appc.db.user.sdnctl=test
+org.openecomp.appc.db.pass.sdnctl=123456
+
+org.openecomp.appc.netconf.db.url.sdnctl=jdbc:mysql://127.0.0.1:3306/test
+org.openecomp.appc.netconf.db.user.sdnctl=test
+org.openecomp.appc.netconf.db.pass.sdnctl=123456
+
+### ###
+### Properties commented out below provided in appc.properties ###
+### ###
+#event.pool.members=<MY_DMAAP_URL>
+event.topic.write=APPC-TEST1
+event.client.key=VIlbtVl6YLhNUrtU
+event.client.secret=64AG2hF4pYeG2pq7CT6XwUOT
+#restconf.user=<RESTCONF_USER>
+#restconf.pass=<RESTCONF_PASSWORD>
+
+org.openecomp.appc.adapter.netconf.VNFOperationalStateValidatorImpl-CONFIG_FILE=VnfGetOperationalStates
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/xsd/vf-license-model.xsd b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/xsd/vf-license-model.xsd
new file mode 100644
index 0000000..9fb9796
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/main/resources/xsd/vf-license-model.xsd
@@ -0,0 +1,88 @@
+<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="vf-license-model">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="vnf-id"/>
+ <xs:element type="xs:string" name="vendor-name"/>
+ <xs:element name="feature-group-list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="feature-group">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="feature-group-uuid"/>
+ <xs:element type="xs:string" name="name"/>
+ <xs:element type="xs:string" name="description"/>
+ <xs:element type="xs:string" name="att-part-number"/>
+ <xs:element name="entitlement-pool-list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="entitlement-pool">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="entitlement-pool-uuid"/>
+ <xs:element type="xs:string" name="name"/>
+ <xs:element type="xs:string" name="description"/>
+ <xs:element type="xs:string" name="manufacturer-reference-number"/>
+ <xs:element name="threshold-value">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:byte" name="value"/>
+ <xs:element type="xs:string" name="unit"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="entitlement-metric">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="value"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element type="xs:string" name="increments"/>
+ <xs:element name="aggregation-function">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="value"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="time">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="value"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="license-key-group-list">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="license-key-group">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element type="xs:string" name="license-key-group-uuid"/>
+ <xs:element type="xs:string" name="name"/>
+ <xs:element type="xs:string" name="description"/>
+ <xs:element type="xs:string" name="type"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImplTest.java
new file mode 100644
index 0000000..9b82900
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/DCAEReporterPluginImplTest.java
@@ -0,0 +1,154 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import org.junit.*;
+import org.junit.runner.RunWith;
+import org.mockito.*;
+import org.openecomp.appc.adapter.dmaap.EventSender;
+import org.openecomp.appc.adapter.dmaap.DmaapDestination;
+import org.openecomp.appc.adapter.dmaap.event.EventMessage;
+import org.openecomp.appc.dg.common.impl.Constants;
+import org.openecomp.appc.dg.common.impl.DCAEReporterPluginImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({DCAEReporterPluginImpl.class, FrameworkUtil.class})
+public class DCAEReporterPluginImplTest {
+ private SvcLogicContext ctx;
+ private Map<String, String> params;
+
+ private final BundleContext bundleContext=Mockito.mock(BundleContext.class);
+ private final Bundle bundleService=Mockito.mock(Bundle.class);
+ private final ServiceReference sref=Mockito.mock(ServiceReference.class);
+
+
+ private DCAEReporterPluginImpl dcaeReporterPlugin;
+ private EventSenderMock eventSender;
+
+ private String apiVer = "2.0.0";
+ private String requestId = "123";
+ private String error = "test-error";
+
+ @Before
+ public void setUp() throws NoSuchFieldException, IllegalAccessException {
+ eventSender = new EventSenderMock();
+ PowerMockito.mockStatic(FrameworkUtil.class);
+ PowerMockito.when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService);
+ PowerMockito.when(bundleService.getBundleContext()).thenReturn(bundleContext);
+ PowerMockito.when(bundleContext.getServiceReference(Matchers.any(Class.class))).thenReturn(sref);
+ PowerMockito.when(bundleContext.getService(sref)).thenReturn(eventSender);
+ dcaeReporterPlugin = new DCAEReporterPluginImpl();
+
+ }
+
+
+
+
+ @Test
+ public void testReportBwcTrue() throws Exception {
+
+ ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ ctx.setAttribute("isBwcMode", "true");
+ params.put(Constants.DG_ERROR_FIELD_NAME, error);
+ ctx.setAttribute(Constants.API_VERSION_FIELD_NAME, apiVer);
+ ctx.setAttribute(Constants.REQ_ID_FIELD_NAME, requestId);
+
+ positiveAssert();
+ }
+
+ @Test
+ public void testReportErrorDescriptionNullBwcModeTrue() throws Exception {
+
+ ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ ctx.setAttribute("isBwcMode", "true");
+ params.put(Constants.DG_ERROR_FIELD_NAME, null);
+ ctx.setAttribute(Constants.API_VERSION_FIELD_NAME, apiVer);
+ ctx.setAttribute(Constants.REQ_ID_FIELD_NAME, requestId);
+
+ errorReasonNullAssert();
+ }
+
+ @Test
+ public void testReportErrorDescriptionNullBwcModeFalse() throws Exception {
+
+ ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ ctx.setAttribute("isBwcMode", "false");
+ params.put("output.status.message", null);
+ ctx.setAttribute("input.common-header.api-ver", apiVer);
+ ctx.setAttribute("input.common-header.request-id", requestId);
+
+ errorReasonNullAssert();
+ }
+
+
+ private void errorReasonNullAssert() throws APPCException {
+ dcaeReporterPlugin.report(params, ctx);
+ DmaapDestination destination = eventSender.getDestination();
+ EventMessage msg = eventSender.getMsg();
+ Assert.assertEquals("wrong API version", apiVer, msg.getEventHeader().getApiVer());
+ Assert.assertEquals("wrong requestId", requestId, msg.getEventHeader().getEventId());
+ Assert.assertEquals("wrong error message", "Unknown", msg.getEventStatus().getReason());
+ Assert.assertEquals("wrong destination", destination.name(), "DCAE");
+
+ }
+
+
+ private void positiveAssert() throws APPCException {
+ dcaeReporterPlugin.report(params, ctx);
+ DmaapDestination destination = eventSender.getDestination();
+ EventMessage msg = eventSender.getMsg();
+ Assert.assertEquals("wrong API version", apiVer, msg.getEventHeader().getApiVer());
+ Assert.assertEquals("wrong requestId", requestId, msg.getEventHeader().getEventId());
+ Assert.assertEquals("wrong error message", error, msg.getEventStatus().getReason());
+ Assert.assertEquals("wrong destination", destination.name(), "DCAE");
+
+ }
+
+
+ @Test
+ public void testReportBwcFalse() throws Exception {
+ ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ ctx.setAttribute("isBwcMode", "false");
+ params.put("output.status.message", error);
+ ctx.setAttribute("input.common-header.api-ver", apiVer);
+ ctx.setAttribute("input.common-header.request-id", requestId);
+
+ positiveAssert();
+
+ }
+ }
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/EventSenderMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/EventSenderMock.java
new file mode 100644
index 0000000..0e6b165
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/EventSenderMock.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import java.util.Map;
+
+import org.openecomp.appc.adapter.dmaap.EventSender;
+import org.openecomp.appc.adapter.dmaap.DmaapDestination;
+import org.openecomp.appc.adapter.dmaap.event.EventMessage;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+
+public class EventSenderMock implements EventSender {
+ EventMessage msg;
+ DmaapDestination destination;
+
+ @Override
+ public boolean sendEvent(DmaapDestination destination, EventMessage msg) {
+ if (destination != null && msg != null){
+ this.msg = msg;
+ this.destination = destination;
+ return true;
+ }
+ else{
+ return false;
+ }
+ }
+
+ @Override
+ public boolean sendEvent(DmaapDestination destination, Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ return false;
+ }
+
+ public EventMessage getMsg() {
+ return msg;
+ }
+
+ public DmaapDestination getDestination() {
+ return destination;
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImplTest.java
new file mode 100644
index 0000000..7053487
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-common/src/test/java/org/openecomp/appc/dg/common/impl/JsonDgUtilImplTest.java
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.common.impl;
+
+import ch.qos.logback.core.Appender;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.appc.dg.common.impl.JsonDgUtilImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.mock;
+
+public class JsonDgUtilImplTest {
+
+ private final Appender appender = mock(Appender.class);
+
+
+ @Test
+ public void testFlatAndAddToContext() throws Exception {
+ JsonDgUtilImpl jsonDgUtil = new JsonDgUtilImpl();
+ String key = "payload";
+ String testValueKey = "test-key";
+ String testValueValue = "test-value";
+ String testValueKey2 = "test-key2";
+ String testValueValue2 = "test-value2";
+ String payload = "{\"" + testValueKey + "\": \"" + testValueValue + "\",\""+testValueKey2+"\": \""+testValueValue2+"\"}";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ Map<String, String> params = new HashMap<>();
+ params.put(key, payload);
+ jsonDgUtil.flatAndAddToContext(params, ctx);
+
+
+ Assert.assertEquals(ctx.getAttribute(testValueKey), testValueValue);
+ Assert.assertEquals(ctx.getAttribute(testValueKey2), testValueValue2);
+
+
+
+ }
+
+
+ @Test
+ public void testFlatAndAddToContextNegativeWrongPayload() throws Exception {
+ JsonDgUtilImpl jsonDgUtil = new JsonDgUtilImpl();
+ String key = "payload";
+ String testValueKey = "test-key";
+ String testValueValue = "test-value";
+ String testValueKey2 = "test-key2";
+ String testValueValue2 = "test-value2";
+ String payload = "{{\"" + testValueKey + "\": \"" + testValueValue + "\",\""+testValueKey2+"\": \""+testValueValue2+"\"}";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ Map<String, String> params = new HashMap<>();
+ params.put(key, payload);
+ try {
+ jsonDgUtil.flatAndAddToContext(params, ctx);
+
+ } catch (APPCException e) {
+ Assert.assertNull(ctx.getAttribute(testValueKey));
+ Assert.assertNull(ctx.getAttribute(testValueKey2));
+ Assert.assertNotNull(ctx.getAttribute("output.status.message"));
+ }
+
+
+ }
+
+
+ @Test
+ public void testFlatAndAddToContextPayloadFromContext() throws Exception {
+ JsonDgUtilImpl jsonDgUtil = new JsonDgUtilImpl();
+ String key = "payload";
+ String testValueKey = "test-key";
+ String testValueValue = "test-value";
+ String testValueKey2 = "test-key2";
+ String testValueValue2 = "test-value2";
+ String payload = "{\"" + testValueKey + "\": \"" + testValueValue + "\",\""+testValueKey2+"\": \""+testValueValue2+"\"}";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ Map<String, String> params = new HashMap<>();
+ params.put(key, "");
+ ctx.setAttribute("input.payload", payload);
+ jsonDgUtil.flatAndAddToContext(params, ctx);
+
+
+ Assert.assertEquals(ctx.getAttribute(testValueKey), testValueValue);
+ Assert.assertEquals(ctx.getAttribute(testValueKey2), testValueValue2);
+ }
+
+ @Test
+ public void testFlatAndAddToContextNegativeNullPayload() throws Exception {
+ JsonDgUtilImpl jsonDgUtil = new JsonDgUtilImpl();
+ String testValueKey = "test-key";
+ String testValueKey2 = "test-key2";
+ SvcLogicContext ctx = new SvcLogicContext();
+ Map<String, String> params = new HashMap<>();
+ jsonDgUtil.flatAndAddToContext(params, ctx);
+
+
+ Assert.assertNull(ctx.getAttribute(testValueKey));
+ Assert.assertNull(ctx.getAttribute(testValueKey2));
+ }
+
+
+ @Test
+ public void testFlatAndAddToContextNegativeEmptyPayload() throws Exception {
+
+ JsonDgUtilImpl jsonDgUtil = new JsonDgUtilImpl();
+ String key = "payload";
+ String testValueKey = "test-key";
+ String testValueKey2 = "test-key2";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ Map<String, String> params = new HashMap<>();
+ params.put(key, "");
+ jsonDgUtil.flatAndAddToContext(params, ctx);
+
+ Assert.assertNull(ctx.getAttribute(testValueKey));
+ Assert.assertNull(ctx.getAttribute(testValueKey2));
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/pom.xml
new file mode 100644
index 0000000..63cb725
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/pom.xml
@@ -0,0 +1,57 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-license-manager</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-common</artifactId>
+ <version>${project.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-license-manager-api</artifactId>
+ <version>1.0.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-dg-license-manager</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.appc.dg.licmgr</Export-Package>
+ <Export-Service>org.openecomp.appc.dg.licmgr.LicenseManagerPlugin</Export-Service>
+ <Private-Package>org.openecomp.appc.dg.licmgr.impl</Private-Package>
+ <Import-Package>org.openecomp.appc.licmgr,org.openecomp.appc.licmgr.exception,org.openecomp.appc.licmgr.objects,!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package>
+ <Embed-Dependency>appc-license-manager-api,appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/LicenseManagerPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/LicenseManagerPlugin.java
new file mode 100644
index 0000000..6ca6b6a
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/LicenseManagerPlugin.java
@@ -0,0 +1,53 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.licmgr;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+
+public interface LicenseManagerPlugin extends SvcLogicJavaPlugin {
+ /**
+ * Retrieves license model from APPC database and populate flags into svc context
+ * @param params map with parameters:
+ * org.openecomp.appc.vftype - the vnf type / service type;
+ * org.openecomp.appc.resource-version - the vnf version / service version
+ * @param ctx service logic context
+ * 1. supposed properties already in context:
+ * aai.input.data.entitlement-assignment-group-uuid - entitlement-group-uuid asset tag already stored in AAI
+ * aai.input.data.license-assignment-group-uuid - license-key-uuid asset tag already stored in AAI
+ * 2. properties and flags stored in context after bean execution:
+ * model.entitlement.pool.uuid - entitlement-group-uuid from license model
+ * model.license.key.uuid - license-key-uuid from license model
+ * is.acquire-entitlement.require
+ * is.release-entitlement.require
+ * is.acquire-license.require
+ * is.release-license.require
+ *
+ * @throws APPCException throws in case of any error
+ */
+ void retrieveLicenseModel(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/impl/LicenseManagerPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/impl/LicenseManagerPluginImpl.java
new file mode 100644
index 0000000..536a991
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/java/org/openecomp/appc/dg/licmgr/impl/LicenseManagerPluginImpl.java
@@ -0,0 +1,145 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.licmgr.impl;
+
+import java.util.Map;
+
+import org.openecomp.appc.dg.licmgr.LicenseManagerPlugin;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.licmgr.Constants;
+import org.openecomp.appc.licmgr.LicenseManager;
+import org.openecomp.appc.licmgr.exception.DataAccessException;
+import org.openecomp.appc.licmgr.objects.LicenseModel;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+
+
+public class LicenseManagerPluginImpl implements LicenseManagerPlugin {
+
+ private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+
+ // populated by blueprint framework
+ private LicenseManager licenseManager;
+
+ public void setLicenseManager(LicenseManager licenseManager) {
+ this.licenseManager = licenseManager;
+ }
+
+ /**
+ * Retrieves license model from APPC database and populate flags into svc context
+ * @param params map with parameters:
+ * org.openecomp.appc.vftype - the vnf type / service type;
+ * org.openecomp.appc.resource-version - the vnf version / service version
+ * @param ctx service logic context
+ * 1. supposed properties already in context:
+ * aai.input.data.entitlement-assignment-group-uuid - entitlement-group-uuid asset tag already stored in AAI
+ * aai.input.data.license-assignment-group-uuid - license-key-uuid asset tag already stored in AAI
+ * 2. properties and flags stored in context after bean execution:
+ * model.entitlement.pool.uuid - entitlement-group-uuid from license model
+ * model.license.key.uuid - license-key-uuid from license model
+ * is.acquire-entitlement.require
+ * is.release-entitlement.require
+ * is.acquire-license.require
+ * is.release-license.require
+ * is.aai-entitlement-update.require
+ * is.aai-license-update.require
+ *
+ * @throws APPCException throws in case of any error
+ */
+ @Override
+ public void retrieveLicenseModel(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+
+ try {
+
+ LicenseModel licenseModel = licenseManager.retrieveLicenseModel(params.get(Constants.VNF_TYPE_FIELD_NAME), params.get(Constants.VNF_RESOURCE_VERSION_FIELD_NAME));
+
+ String modelEntitlementPoolUuid = licenseModel.getEntitlementPoolUuid(); if (null == modelEntitlementPoolUuid) modelEntitlementPoolUuid = "";
+ String aaiEntitlementPoolUuid = ctx.getAttribute(Constants.AAI_ENTITLMENT_POOL_UUID_NAME); if (null == aaiEntitlementPoolUuid) aaiEntitlementPoolUuid = "";
+ boolean isAcquireEntitlementRequire = !modelEntitlementPoolUuid.isEmpty() && !modelEntitlementPoolUuid.equals(aaiEntitlementPoolUuid);
+ boolean isReleaseEntitlementRequire = !aaiEntitlementPoolUuid.isEmpty() && (isAcquireEntitlementRequire || modelEntitlementPoolUuid.isEmpty());
+ boolean isAAIEntitlementUpdateRequire = isAcquireEntitlementRequire || isReleaseEntitlementRequire;
+ ctx.setAttribute(Constants.MODEL_ENTITLMENT_POOL_UUID_NAME, modelEntitlementPoolUuid);
+ ctx.setAttribute(Constants.IS_ACQUIRE_ENTITLEMENT_REQUIRE, Boolean.toString(isAcquireEntitlementRequire));
+ ctx.setAttribute(Constants.IS_RELEASE_ENTITLEMENT_REQUIRE, Boolean.toString(isReleaseEntitlementRequire));
+ ctx.setAttribute(Constants.IS_AAI_ENTITLEMENT_UPDATE_REQUIRE, Boolean.toString(isAAIEntitlementUpdateRequire));
+
+
+ String modelLicenseKeyGroupUuid = licenseModel.getLicenseKeyGroupUuid(); if (null == modelLicenseKeyGroupUuid) modelLicenseKeyGroupUuid = "";
+ String aaiLicenseKeyGroupUuid = ctx.getAttribute(Constants.AAI_LICENSE_KEY_UUID_NAME); if (null == aaiLicenseKeyGroupUuid) aaiLicenseKeyGroupUuid = "";
+ String aaiLicenseKeyValue = ctx.getAttribute(Constants.AAI_LICENSE_KEY_VALUE); if (null == aaiLicenseKeyValue) aaiLicenseKeyValue = "";
+ boolean isAcquireLicenseRequire = !modelLicenseKeyGroupUuid.isEmpty() && !modelLicenseKeyGroupUuid.equals(aaiLicenseKeyGroupUuid);
+ boolean isReleaseLicenseRequire = !aaiLicenseKeyGroupUuid.isEmpty() && (isAcquireLicenseRequire || modelLicenseKeyGroupUuid.isEmpty());
+ boolean isAAILicenseUpdateRequire = isAcquireLicenseRequire || isReleaseLicenseRequire;
+ ctx.setAttribute(Constants.MODEL_LICENSE_KEY_UUID_NAME, modelLicenseKeyGroupUuid);
+ ctx.setAttribute(Constants.IS_ACQUIRE_LICENSE_REQUIRE, Boolean.toString(isAcquireLicenseRequire));
+ ctx.setAttribute(Constants.IS_RELEASE_LICENSE_REQUIRE, Boolean.toString(isReleaseLicenseRequire));
+ ctx.setAttribute(Constants.IS_AAI_LICENSE_UPDATE_REQUIRE, Boolean.toString(isAAILicenseUpdateRequire));
+
+ ctx.setAttribute("license-key", aaiLicenseKeyValue);
+
+ } catch (DataAccessException le) {
+ logger.error("Error " + le.getMessage());
+ ctx.setAttribute("output.status.message", le.getMessage());
+ throw new APPCException(le);
+ }
+
+ }
+
+
+
+ //////// code uses jaxb license model, should be fixed
+ /*
+ final VfLicenseModel.FeatureGroupList featureGroupList = licenseModel.getFeatureGroupList();
+ if (null != featureGroupList) {
+ final VfLicenseModel.FeatureGroupList.FeatureGroup featureGroup = featureGroupList.getFeatureGroup();
+ if (null != featureGroup) {
+ final VfLicenseModel.FeatureGroupList.FeatureGroup.EntitlementPoolList
+ entitlementPoolList = featureGroup.getEntitlementPoolList();
+ if (null != entitlementPoolList) {
+ final VfLicenseModel.FeatureGroupList.FeatureGroup.EntitlementPoolList.EntitlementPool
+ entitlementPool = entitlementPoolList.getEntitlementPool();
+ if (null != entitlementPool) {
+ final String entitlementPoolUuid = entitlementPool.getEntitlementPoolUuid();
+ // add entitlementPoolUuid into context
+ ctx.setAttribute(Constants.MODEL_ENTITLMENT_POOL_UUID_NAME, entitlementPoolUuid);
+ }
+ }
+
+ final VfLicenseModel.FeatureGroupList.FeatureGroup.LicenseKeyGroupList
+ licenseKeyGroupList = featureGroup.getLicenseKeyGroupList();
+ if (null != licenseKeyGroupList) {
+ final VfLicenseModel.FeatureGroupList.FeatureGroup.LicenseKeyGroupList.LicenseKeyGroup
+ licenseKeyGroup = licenseKeyGroupList.getLicenseKeyGroup();
+ if (null != licenseKeyGroup) {
+ final String licenseKeyGroupUuid = licenseKeyGroup.getLicenseKeyGroupUuid();
+ // add licenseKeyGroupUuid into context
+ ctx.setAttribute(Constants.MODEL_LICENSE_KEY_UUID_NAME, licenseKeyGroupUuid);
+ }
+ }
+ }
+ }
+ */
+
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..ab2df8b
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-license-manager/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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=========================================================
+ -->
+
+<!--
+ Starter Blueprint Camel Definition appc-aai-adapter-blueprint
+-->
+<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">
+
+
+ <reference id="LicenseManagerRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.licmgr.LicenseManager" />
+
+ <bean id="LicenseManagerPluginBean" class="org.openecomp.appc.dg.licmgr.impl.LicenseManagerPluginImpl" scope="singleton">
+ <property name="licenseManager" ref="LicenseManagerRef" />
+ </bean>
+ <service id="LicenseManagerPlugin" interface="org.openecomp.appc.dg.licmgr.LicenseManagerPlugin" ref="LicenseManagerPluginBean"/>
+
+</blueprint>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml
new file mode 100644
index 0000000..c9ec4d9
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml
@@ -0,0 +1,89 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-netconf</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-netconf-adapter-bundle</artifactId>
+ <version>${project.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-common</artifactId>
+ <version>${project.version}</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-provider</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+
+ </dependency>
+ <dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ <version>1.6.2</version>
+ <scope>test</scope>
+ </dependency>
+
+
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-dg-netconf</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.appc.dg.netconf</Export-Package>
+ <Private-Package>org.openecomp.appc.dg.netconf.impl.*</Private-Package>
+ <Import-Package>!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package>
+ <Embed-Dependency>appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java
new file mode 100644
index 0000000..3b75f40
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java
@@ -0,0 +1,39 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+
+public interface NetconfClientPlugin extends SvcLogicJavaPlugin {
+ void configure(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void operationStateValidation(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void modifyConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void backupConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void getConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void getRunningConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java
new file mode 100644
index 0000000..a48be94
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java
@@ -0,0 +1,37 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+
+public interface NetconfDBPlugin extends SvcLogicJavaPlugin {
+ void retrieveDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void retrieveVMDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void retrieveConfigFile(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+ void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java
new file mode 100644
index 0000000..d063b5d
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java
@@ -0,0 +1,316 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.openecomp.appc.adapter.netconf.*;
+import org.openecomp.appc.adapter.netconf.util.Constants;
+import org.openecomp.appc.dg.netconf.NetconfClientPlugin;
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+
+
+public class NetconfClientPluginImpl implements NetconfClientPlugin {
+
+ private static final String NETCONF_CLIENT_FACTORY_NAME = "org.openecomp.appc.adapter.netconf.NetconfClientFactory";
+ private static ObjectMapper mapper = new ObjectMapper();
+ private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+
+ private NetconfDataAccessService dao;
+ private NetconfClientFactory clientFactory;
+
+ public NetconfClientPluginImpl() {
+ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ ServiceReference srefNetconfClientFactory = bctx.getServiceReference(NetconfClientFactory.class);
+ clientFactory = (NetconfClientFactory) bctx.getService(srefNetconfClientFactory);
+ }
+
+ public void setDao(NetconfDataAccessService dao) {
+ this.dao = dao;
+ this.dao.setSchema(Constants.NETCONF_SCHEMA);
+ }
+
+ public void configure(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+
+ try {
+ NetconfClient client = clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ try {
+ NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class);
+ String netconfMessage = params.get("file-content");
+ client.connect(connectionDetails);
+ client.configure(netconfMessage);
+ } catch (IOException e) {
+ logger.error("Error " + e.getMessage());
+ throw new APPCException(e);
+ } finally {
+ client.disconnect();
+ }
+ } catch (Exception e) {
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ logger.error("Error " + e.getMessage());
+ throw e;
+ }
+ }
+
+ @Override
+ public void operationStateValidation(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ if (logger.isTraceEnabled()) {
+ logger.trace("Entering to operationStateValidation with params = "+ ObjectUtils.toString(params)+", SvcLogicContext = "+ObjectUtils.toString(ctx));
+ }
+ try{
+ String paramName = Constants.VNF_TYPE_FIELD_NAME;
+ String vfType = params.get(paramName);
+ validateMandatoryParam(paramName, vfType);
+ VnfType vnfType = VnfType.getVnfType(vfType);
+
+ paramName = Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME;
+ String vnfHostIpAddress = params.get(paramName);
+ validateMandatoryParam(paramName, vnfHostIpAddress);
+
+ //get connectionDetails
+ String connectionDetailsStr = params.get(Constants.CONNECTION_DETAILS_FIELD_NAME);
+ NetconfConnectionDetails connectionDetails = null;
+ if(StringUtils.isEmpty(connectionDetailsStr)){
+ connectionDetails = retrieveConnectionDetails(vnfType);
+ connectionDetails.setHost(vnfHostIpAddress);
+ ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails));
+ }else{
+ connectionDetails = mapper.readValue(connectionDetailsStr, NetconfConnectionDetails.class);
+ }
+ if(connectionDetails == null){
+ throw new IllegalStateException("missing connectionDetails for VnfType:"+vnfType.name());
+ }
+
+ //get operationsStateNetconfMessage
+ OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(vnfType);
+ String configurationFileName = operationalStateValidator.getConfigurationFileName();
+ String operationsStateNetconfMessage = null;
+ if(!StringUtils.isEmpty(configurationFileName)){
+ operationsStateNetconfMessage = retrieveConfigurationFileContent(configurationFileName);
+ }
+
+ //connect checK Opertaions state and dissconnect
+ NetconfClient client = clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ try {
+ client.connect(connectionDetails);
+ String response = null;
+ if(!StringUtils.isEmpty(operationsStateNetconfMessage)) {
+ response = client.exchangeMessage(operationsStateNetconfMessage);
+ }
+ operationalStateValidator.validateResponse(response);
+ } finally {
+ client.disconnect();
+ }
+ } catch (APPCException e) {
+ logger.error(e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.toString());
+ throw e;
+ }
+ catch (Exception e) {
+ logger.error(e.toString());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.toString());
+ throw new APPCException(e);
+ }
+ }
+
+ @Override
+ public void modifyConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ this.configure(params, ctx);
+ }
+
+ @Override
+ public void backupConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+
+ NetconfClient client = null;
+ try {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Entered backup to DEVICE_INTERFACE_LOG");
+ }
+
+ client = clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ //get connection details
+ NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class);
+ //connect the client and get configuration
+ client.connect(connectionDetails);
+ String configuration = client.getConfiguration();
+
+ //store configuration in database
+ dao.logDeviceInteraction(null,null,getCurrentDateTime(),configuration);
+
+ } catch (Exception e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ } finally {
+ //disconnect the client
+ if(client != null) {
+ client.disconnect();
+ }
+ }
+ }
+
+ @Override
+ public void getConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ NetconfClient client = null;
+ String confId=params.get("conf-id");
+ if(confId.equalsIgnoreCase("current")){
+ try {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Entered getConfig to DEVICE_INTERFACE_LOG");
+ }
+ //get netconf client to get configuration
+ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ ServiceReference sref = bctx.getServiceReference(NETCONF_CLIENT_FACTORY_NAME);
+ NetconfClientFactory clientFactory = (NetconfClientFactory) bctx.getService(sref);
+ client = clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ //get connection details
+ NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class);
+ //connect the client and get configuration
+ client.connect(connectionDetails);
+ String configuration = client.getConfiguration();
+ if(configuration !=null){
+ // logger.info("*************************************Configuration Output*************************************");
+ // logger.info(configuration);
+ String fullConfig = ctx.getAttribute("fullConfig");
+ fullConfig = fullConfig==null?"":fullConfig;
+ ctx.setAttribute("fullConfig",fullConfig + configuration);
+
+ ctx.setAttribute("getConfig_Result","Success");
+ String entityName=ctx.getAttribute("entity");//VM name
+ if(entityName!=null){
+ ctx.setAttribute(entityName+".Configuration",configuration);
+ }
+ }else{
+ ctx.setAttribute("getConfig_Result","failure");
+ }
+ //store configuration in database
+ /*NetconfJDBC dsImpl = new NetconfJDBCImpl();
+ dsImpl.logDeviceInteraction(null,null,getCurrentDateTime(),configuration);*/
+
+ } catch (Exception e) {
+ ctx.setAttribute("getConfig_Result","failure");
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ } finally {
+ //disconnect the client
+ if(client != null) {
+ client.disconnect();
+ }
+ }
+ }else{
+ logger.info("Current Conf id value is not supported");
+ }
+
+ }
+
+
+ @Override
+ public void getRunningConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ NetconfClient client = null;
+ try {
+ logger.info("Entered getRunningConfig to DEVICE_INTERFACE_LOG");
+ //get netconf client to get configuration
+ BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ ServiceReference sref = bctx.getServiceReference(NETCONF_CLIENT_FACTORY_NAME);
+ NetconfClientFactory clientFactory = (NetconfClientFactory) bctx.getService(sref);
+ client = clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ //get connection details
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ connectionDetails.setHost(params.get("host-ip-address"));
+ connectionDetails.setUsername(params.get("user-name"));
+ connectionDetails.setPassword(params.get("password"));
+ connectionDetails.setPort(!("".equalsIgnoreCase(params.get("port-number")))?Integer.parseInt(params.get("port-number")):NetconfConnectionDetails.DEFAULT_PORT);
+ //connect the client and get configuration
+ client.connect(connectionDetails);
+ String configuration = client.getConfiguration();
+ if(configuration !=null){
+ // logger.info("*************************************Configuration Output*************************************");
+ ctx.setAttribute("running-config", configuration);
+
+ ctx.setAttribute("getRunningConfig_Result","Success");
+ }else{
+ ctx.setAttribute("getRunningConfig_Result","failure");
+ }
+ } catch (Exception e) {
+ ctx.setAttribute("getRunningConfig_Result","failure");
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ } finally {
+ //disconnect the client
+ if(client != null) {
+ client.disconnect();
+ }
+ }
+ }
+
+ private String getCurrentDateTime() {
+
+ DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+ Date date = new Date();
+ return dateFormat.format(date);
+ }
+
+ private int getPort(String s) {
+ int port = 830;
+ if((s != null) && !s.isEmpty()) {
+ port = Integer.parseInt(s);
+ }
+ return port;
+ }
+
+ void validateMandatoryParam(String paramName, String paramValue) {
+ if(StringUtils.isEmpty(paramValue)){
+ throw new IllegalArgumentException("input "+paramName+" param is empty");
+ }
+ }
+
+ public NetconfConnectionDetails retrieveConnectionDetails( VnfType vnfType) throws APPCException{
+
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ if (!dao.retrieveNetconfConnectionDetails(vnfType.getFamilyType().name(), connectionDetails)) {
+ logger.error("Missing configuration for " + vnfType.getFamilyType().name());
+ throw new APPCException("Missing configuration for " + vnfType.getFamilyType().name() + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME);
+ }
+ return connectionDetails;
+ }
+
+ public String retrieveConfigurationFileContent(String configFileName){
+ return dao.retrieveConfigFileName(configFileName);
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java
new file mode 100644
index 0000000..6fdfcc1
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java
@@ -0,0 +1,122 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.Map;
+
+import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails;
+import org.openecomp.appc.adapter.netconf.NetconfDataAccessService;
+import org.openecomp.appc.adapter.netconf.exception.DataAccessException;
+import org.openecomp.appc.adapter.netconf.util.Constants;
+import org.openecomp.appc.dg.netconf.NetconfDBPlugin;
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+public class NetconfDBPluginImpl implements NetconfDBPlugin {
+
+ private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+ private static ObjectMapper mapper = new ObjectMapper();
+
+ // populated by blueprint framework
+ private NetconfDataAccessService daoService;
+
+ public void setDaoService(NetconfDataAccessService daoService) {
+ this.daoService = daoService;
+ this.daoService.setSchema(Constants.NETCONF_SCHEMA);
+ }
+
+ public NetconfDBPluginImpl() {
+ }
+
+ public void retrieveDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+
+ try {
+ String fileContent = daoService.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME));
+ ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent);
+ } catch(DataAccessException e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw e;
+ }
+
+ getConnection(params, ctx);
+ }
+
+ @Override
+ public void retrieveVMDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ logger.info("Setting entity value :" +params.get(Constants.RESOURCEKEY));
+ ctx.setAttribute("entity", params.get(Constants.RESOURCEKEY));
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ try {
+ if (!daoService.retrieveNetconfConnectionDetails(params.get(Constants.RESOURCEKEY), connectionDetails)) {
+ ctx.setAttribute("retrieveVMDSConfiguration_Result","failure");
+ logger.error("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME));
+ throw new APPCException("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME) + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME);
+ }
+ // fileContent = dsImpl.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME));
+ // ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent);
+ ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails));
+ ctx.setAttribute("retrieveVMDSConfiguration_Result","success");
+ } catch(APPCException e) {
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw e;
+ } catch(DataAccessException | JsonProcessingException e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ }
+ }
+
+ @Override
+ public void retrieveConfigFile(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ String fileContent = daoService.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME));
+ ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent);
+ }
+
+ public void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ getConnection(params, ctx);
+ }
+
+ private void getConnection(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails();
+ try {
+ if (!daoService.retrieveNetconfConnectionDetails(params.get(Constants.VNF_TYPE_FIELD_NAME), connectionDetails)) {
+ logger.error("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME));
+ throw new APPCException("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME) + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME);
+ }
+ connectionDetails.setHost(params.get(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME));
+ ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails));
+ } catch(APPCException e) {
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw e;
+ } catch(DataAccessException | JsonProcessingException e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ }
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..0b58ce0
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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=========================================================
+ -->
+
+<!--
+ Starter Blueprint Camel Definition appc-aai-adapter-blueprint
+-->
+<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">
+
+ <reference id="DataAccessServiceRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.adapter.netconf.NetconfDataAccessService" />
+
+
+ <bean id="NetconfDBPluginBean" class="org.openecomp.appc.dg.netconf.impl.NetconfDBPluginImpl" scope="singleton">
+ <property name="daoService" ref="DataAccessServiceRef" />
+ </bean>
+ <service id="NetconfDBPlugin" interface="org.openecomp.appc.dg.netconf.NetconfDBPlugin" ref="NetconfDBPluginBean"/>
+
+ <bean id="NetconfClientPluginBean" class="org.openecomp.appc.dg.netconf.impl.NetconfClientPluginImpl" scope="singleton">
+ <property name="dao" ref="DataAccessServiceRef" />
+ </bean>
+ <service id="NetconfClientPlugin" interface="org.openecomp.appc.dg.netconf.NetconfClientPlugin" ref="NetconfClientPluginBean"/>
+
+</blueprint>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java
new file mode 100644
index 0000000..38d74c3
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import java.util.HashMap;
+
+import org.openecomp.appc.adapter.netconf.ConnectionDetails;
+import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails;
+import org.openecomp.appc.adapter.netconf.NetconfDataAccessService;
+import org.openecomp.appc.adapter.netconf.exception.DataAccessException;
+import org.openecomp.sdnc.sli.resource.dblib.DbLibService;
+
+class DAOServiceMock implements NetconfDataAccessService {
+
+ private String configFile;
+ private ConnectionDetails connection;
+ private HashMap<String, String> backupConf;
+
+ @Override
+ public void setSchema(String schema) {
+ }
+
+ @Override
+ public void setDbLibService(DbLibService dbLibService) {
+ }
+
+ void setConfigFile(String configFile) {
+ this.configFile = configFile;
+ }
+
+ public HashMap<String, String> getBackupConf() {
+ return backupConf;
+ }
+
+ public void setConnection(ConnectionDetails connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public String retrieveConfigFileName(String xmlID) throws DataAccessException {
+ if (!xmlID.equals("wrong")) {
+ return configFile;
+ } else {
+ throw new DataAccessException();
+ }
+ }
+
+ @Override
+ public boolean retrieveConnectionDetails(String vnfType, ConnectionDetails connectionDetails) throws
+ DataAccessException {
+ return false;
+ }
+
+ @Override
+ public boolean retrieveNetconfConnectionDetails(String vnfType, NetconfConnectionDetails connectionDetails) throws
+ DataAccessException {
+ if (vnfType.equals("VNF")) {
+ connectionDetails.setHost(connection.getHost());
+ connectionDetails.setPassword(connection.getPassword());
+ connectionDetails.setPort(connection.getPort());
+ connectionDetails.setUsername(connection.getUsername());
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean logDeviceInteraction(String instanceId, String requestId, String creationDate, String logText) throws
+ DataAccessException {
+ this.backupConf = new HashMap<>();
+ backupConf.put("creationDate", creationDate);
+ backupConf.put("logText", logText);
+ return true;
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java
new file mode 100644
index 0000000..7109fe8
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import org.openecomp.appc.adapter.netconf.OperationalStateValidator;
+import org.openecomp.appc.adapter.netconf.VnfType;
+import org.openecomp.appc.exceptions.APPCException;
+
+
+public class MockOperationalStateValidatorImpl implements OperationalStateValidator {
+
+ private boolean validated;
+ private String configurationFileName;
+
+ public boolean isValidated() {
+ return validated;
+ }
+
+ @Override
+ public VnfType getVnfType() {
+ return null;
+ }
+
+ @Override
+ public String getConfigurationFileName() {
+ return configurationFileName;
+ }
+
+ @Override
+ public void validateResponse(String response) throws APPCException {
+ if (response.equals("wrong")) {
+ throw new APPCException();
+ } else {
+ this.validated = true;
+ }
+
+ }
+
+ public void setConfigurationFileName(String configurationFileName) {
+ this.configurationFileName = configurationFileName;
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java
new file mode 100644
index 0000000..73dba9a
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java
@@ -0,0 +1,43 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import org.openecomp.appc.adapter.netconf.NetconfClient;
+import org.openecomp.appc.adapter.netconf.NetconfClientFactory;
+import org.openecomp.appc.adapter.netconf.NetconfClientType;
+import org.openecomp.appc.adapter.netconf.jsch.NetconfClientJsch;
+import org.openecomp.appc.adapter.netconf.odlconnector.NetconfClientRestconfImpl;
+
+
+public class NetconfClientFactoryMock extends NetconfClientFactory {
+
+ private final NetconfClientJschMock jschClient = new NetconfClientJschMock();
+
+ @Override
+ public NetconfClient GetNetconfClient(NetconfClientType type){
+
+ return jschClient;
+
+ }
+}
+
+
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java
new file mode 100644
index 0000000..5c01724
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java
@@ -0,0 +1,100 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import org.openecomp.appc.adapter.netconf.NetconfClient;
+import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails;
+import org.openecomp.appc.exceptions.APPCException;
+
+
+public class NetconfClientJschMock implements NetconfClient {
+
+ private boolean connection;
+ private String lastMessage;
+ private String answer = "answer";
+ private String configuration;
+ private NetconfConnectionDetails lastConnectionDetails;
+
+ public boolean isConnection() {
+ return connection;
+ }
+
+ public String getLastMessage() {
+ return lastMessage;
+ }
+
+ public String getAnswer() {
+ return answer;
+ }
+
+ public String getConf() {
+ return configuration;
+ }
+
+ public void setConf(String configuration) {
+ this.configuration = configuration;
+ }
+
+ public void setAnswer(String answer) {
+ this.answer = answer;
+ }
+
+ public NetconfConnectionDetails getLastConnectionDetails() {
+ return lastConnectionDetails;
+ }
+
+ @Override
+ public void connect(NetconfConnectionDetails connectionDetails) throws APPCException {
+ this.connection = true;
+ this.lastConnectionDetails = connectionDetails;
+
+ }
+
+ @Override
+ public String exchangeMessage(String message) throws APPCException {
+ if (connection) {
+ this.lastMessage = message;
+ return answer;
+ } else return null;
+ }
+
+ @Override
+ public void configure(String configuration) throws APPCException {
+ if (connection) {
+ this.configuration = configuration;
+ }
+
+ }
+
+ @Override
+ public String getConfiguration() throws APPCException {
+ if (connection) {
+ return configuration;
+ } else return null;
+ }
+
+ @Override
+ public void disconnect() throws APPCException {
+ this.connection = false;
+
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java
new file mode 100644
index 0000000..b3bb485
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java
@@ -0,0 +1,678 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.openecomp.appc.adapter.netconf.*;
+import org.openecomp.appc.adapter.netconf.util.Constants;
+import org.openecomp.appc.dg.netconf.impl.NetconfClientPluginImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.powermock.api.mockito.PowerMockito.when;
+
+
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({OperationalStateValidatorFactory.class, NetconfClientPluginImpl.class, FrameworkUtil.class, ObjectMapper.class})
+
+public class NetconfClientPluginImplTest {
+ private NetconfClientPluginImpl netconfClientPlugin;
+ private NetconfDataAccessService dao;
+ private NetconfClientFactory clientFactory;
+ private Map<String, String> params;
+
+ private final BundleContext bundleContext = Mockito.mock(BundleContext.class);
+ private final Bundle bundleService = Mockito.mock(Bundle.class);
+ private final ServiceReference sref1 = Mockito.mock(ServiceReference.class);
+ private final ServiceReference sref2 = Mockito.mock(ServiceReference.class);
+ private final ServiceReference sref3 = Mockito.mock(ServiceReference.class);
+ private static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+
+
+ String host = "http://www.test.com";
+ String host1 = "http://www.test1.com";
+ String vnfType = "VNF";
+ int port = 8080;
+ String username = "test";
+ String password = "test";
+ String connectionDetails = "{\"host\":\"" + host + "\",\"port\":" + port + ",\"username\":\"" + username + "\",\"password\":\"" + password + "\",\"capabilities\":null,\"additionalProperties\":null}";
+ String fileContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ "\t<get-config>\n" +
+ "\t\t<source>\n" +
+ "\t\t\t<running/>\n" +
+ "\t\t </source>\n" +
+ "\t</get-config>\n" +
+ "</rpc>'";
+ String operationalState = "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ " <get>\n" +
+ " <filter>\n" +
+ " <ManagedElement xmlns=\"urn:org:openecomp:appc:Test\">\n" +
+ " <VnfFunction xmlns=\"urn:org:openecomop:appc:Test\">\n" +
+ " <ProcessorManagement>\n" +
+ " <MatedPair>\n" +
+ " <operationalState/>\n" +
+ " <PayloadProcessor>\n" +
+ " <operationalState/>\n" +
+ " </PayloadProcessor>\n" +
+ " </MatedPair>\n" +
+ " <SystemController>\n" +
+ " <operationalState/>\n" +
+ " </SystemController>\n" +
+ " </ProcessorManagement>\n" +
+ " </VnfFunction>\n" +
+ " </ManagedElement>\n" +
+ " </filter>\n" +
+ " </get>\n" +
+ "</rpc>\n";
+
+
+ @Before
+ public void setUp() throws NoSuchFieldException, IllegalAccessException {
+ clientFactory = new NetconfClientFactoryMock();
+
+ }
+
+
+ @Test
+ public void testConfigure() throws Exception {
+
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+
+ params = new HashMap<>();
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ params.put(Constants.FILE_CONTENT_FIELD_NAME, fileContent);
+
+ netconfClientPlugin.configure(params, ctx);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+
+ try {
+ Assert.assertEquals("wrong configuration", fileContent, client.getConf());
+ Assert.assertEquals("wrong host", host, client.getLastConnectionDetails().getHost());
+ Assert.assertEquals("wrong port", port, client.getLastConnectionDetails().getPort());
+ Assert.assertEquals("wrong username", username, client.getLastConnectionDetails().getUsername());
+ Assert.assertEquals("wrong password", password, client.getLastConnectionDetails().getPassword());
+ Assert.assertFalse(client.isConnection());
+ } catch (Exception e) {
+ Assert.fail("failed with because of " + e.getCause());
+ }
+
+
+ }
+
+
+ @Test
+ public void testConfigureNegativeIOException() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+
+ params = new HashMap<>();
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails);
+ params.put(Constants.FILE_CONTENT_FIELD_NAME, fileContent);
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+
+
+ try {
+ netconfClientPlugin.configure(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNull(client.getLastConnectionDetails());
+ Assert.assertNull(client.getConf());
+ }
+
+ }
+
+ @Test
+ public void testOperationStateValidation() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer(operationalState);
+
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+
+ netconfClientPlugin.operationStateValidation(params, ctx);
+
+ Assert.assertTrue("validation process failed", validatorMock.isValidated());
+ Assert.assertEquals(fileContent, client.getLastMessage());
+ }
+
+
+ @Test
+ public void testOperationStateValidationNegativeJsonProcessingNullIllegalStateException() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer(operationalState);
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+ substituteMapper(true);
+
+ try {
+ netconfClientPlugin.operationStateValidation(params, ctx);
+ substituteMapper(false);
+ } catch (APPCException e) {
+ substituteMapper(false);
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ Assert.assertFalse(validatorMock.isValidated());
+ Assert.assertNull(client.getLastMessage());
+ }
+ }
+
+ @Test
+ public void testOperationStateValidationNegativeConnectionDetailsAreNullNullPointerException() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer(operationalState);
+
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, null);
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+ ObjectMapper mapper = PowerMockito.mock(ObjectMapper.class);
+ final NetconfConnectionDetails netconfConnectionDetails = null;
+ when(mapper.readValue(Matchers.anyString(), Matchers.any(Class.class))).thenReturn(netconfConnectionDetails);
+
+
+ try {
+ netconfClientPlugin.operationStateValidation(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ Assert.assertFalse("validation process failed", validatorMock.isValidated());
+
+ }
+ }
+
+
+ @Test
+ public void testOperationStateValidationNegativeAppcException() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer("wrong");
+
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+
+
+ try {
+ netconfClientPlugin.operationStateValidation(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ Assert.assertFalse("validation process failed", validatorMock.isValidated());
+
+ }
+ }
+
+
+ @Test
+ public void testOperationStateValidatioConnectionDetailsInParamsAreEmpty() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer(operationalState);
+ ((DAOServiceMock) dao).setConnection(getConnectionDetails());
+
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "");
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+
+ netconfClientPlugin.operationStateValidation(params, ctx);
+
+ Assert.assertTrue("validation process failed", validatorMock.isValidated());
+ Assert.assertEquals(fileContent, client.getLastMessage());
+ }
+
+ @Test
+ public void testOperationStateValidatioConnectionDetailsInParamsAreNull() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setAnswer(operationalState);
+ ((DAOServiceMock) dao).setConnection(getConnectionDetails());
+
+
+ params = new HashMap<>();
+ params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType);
+ params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1);
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, null);
+ MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl();
+ validatorMock.setConfigurationFileName("VnfGetRunningConfig");
+
+ PowerMockito.mockStatic(OperationalStateValidatorFactory.class);
+ when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock);
+
+ netconfClientPlugin.operationStateValidation(params, ctx);
+
+ Assert.assertTrue("validation process failed", validatorMock.isValidated());
+ Assert.assertEquals(fileContent, client.getLastMessage());
+ }
+
+
+ @Test
+ public void testBackupConfiguration() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setConf(fileContent);
+ netconfClientPlugin.backupConfiguration(params, ctx);
+
+ DAOServiceMock mockdao = (DAOServiceMock) dao;
+ DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
+ Date date = new Date();
+ String creationDateExpected = dateFormat.format(date);
+ String creationDateActual = mockdao.getBackupConf().get("creationDate").substring(0, 10);
+
+
+ Assert.assertEquals("wrong configuration in db", fileContent, mockdao.getBackupConf().get("logText"));
+ Assert.assertEquals(creationDateExpected, creationDateActual);
+
+
+ }
+
+
+ @Test
+ public void testBackupConfigurationNegativeDgErrorFieldName() throws Exception {
+ shortInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails);
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setConf(fileContent);
+ try {
+ netconfClientPlugin.backupConfiguration(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+
+ DAOServiceMock mockdao = (DAOServiceMock) dao;
+ Assert.assertNull(mockdao.getBackupConf());
+ }
+
+ }
+
+ @Test
+ public void testGetConfig() throws Exception {
+ fullInit();
+ String entity = "123";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("entity", entity);
+
+ params = new HashMap<>();
+ params.put("conf-id", "current");
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setConf(fileContent);
+
+
+ netconfClientPlugin.getConfig(params, ctx);
+
+ Assert.assertEquals("Success", ctx.getAttribute("getConfig_Result"));
+ Assert.assertEquals(fileContent, ctx.getAttribute("fullConfig"));
+ Assert.assertNotNull(ctx.getAttribute(entity + ".Configuration"));
+ Assert.assertEquals(fileContent, ctx.getAttribute(entity + ".Configuration"));
+ }
+
+
+ @Test
+ public void testGetConfigNegativeConfigurationNull() throws Exception {
+ fullInit();
+ String entity = "123";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("entity", entity);
+
+ params = new HashMap<>();
+ params.put("conf-id", "current");
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+
+
+ netconfClientPlugin.getConfig(params, ctx);
+
+ Assert.assertEquals("failure", ctx.getAttribute("getConfig_Result"));
+ Assert.assertNull(ctx.getAttribute("fullConfig"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ }
+
+
+ @Test
+ public void testGetConfigNegativeNotSupportedConfId() throws Exception {
+ fullInit();
+ String entity = "123";
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("entity", entity);
+
+ params = new HashMap<>();
+ params.put("conf-id", "current1");
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails);
+
+
+ netconfClientPlugin.getConfig(params, ctx);
+
+ Assert.assertNull(ctx.getAttribute("getConfig_Result"));
+ Assert.assertNull(ctx.getAttribute("fullConfig"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ }
+
+ @Test
+ public void testGetConfigNegativeWronjJsonConnectionDetailsException() throws Exception {
+ fullInit();
+ String entity = "123";
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ ctx.setAttribute("entity", entity);
+
+ params = new HashMap<>();
+ params.put("conf-id", "current");
+ params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails);
+
+
+ try {
+ netconfClientPlugin.getConfig(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertEquals("failure", ctx.getAttribute("getConfig_Result"));
+ Assert.assertNull(ctx.getAttribute("fullConfig"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ Assert.assertNull(ctx.getAttribute(entity + ".Configuration"));
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+
+ }
+
+ @Test
+ public void testGetRunningConfig() throws Exception {
+ fullInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("host-ip-address", host);
+ params.put("user-name", username);
+ params.put("password", password);
+ params.put("port-number", String.valueOf(port));
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setConf(fileContent);
+
+ netconfClientPlugin.getRunningConfig(params, ctx);
+
+ Assert.assertEquals("Success", ctx.getAttribute("getRunningConfig_Result"));
+ Assert.assertEquals(fileContent, ctx.getAttribute("running-config"));
+ Assert.assertEquals("success", ctx.getStatus());
+ }
+
+ @Test
+ public void testGetRunningConfigWithoutPortNumberDgErrorFieldNameException() throws Exception {
+ fullInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("host-ip-address", host);
+ params.put("user-name", username);
+ params.put("password", password);
+
+ NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH);
+ client.setConf(fileContent);
+
+ try {
+ netconfClientPlugin.getRunningConfig(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertEquals("failure", ctx.getAttribute("getRunningConfig_Result"));
+ Assert.assertNull(ctx.getAttribute("running-config"));
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+
+ }
+
+ @Test
+ public void testGetRunningConfigNegativeConfigurationNull() throws Exception {
+ fullInit();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("host-ip-address", host);
+ params.put("user-name", username);
+ params.put("password", password);
+ params.put("port-number", String.valueOf(port));
+
+ netconfClientPlugin.getRunningConfig(params, ctx);
+
+ Assert.assertEquals("failure", ctx.getAttribute("getRunningConfig_Result"));
+ Assert.assertNull(ctx.getAttribute("running-config"));
+ }
+
+ @Test
+ public void testValidateMandatoryParamNegativeEmptyParamValue() throws Exception {
+ shortInit();
+ String paramName = "test";
+ String paramValue = "";
+
+ try {
+ netconfClientPlugin.validateMandatoryParam(paramName, paramValue);
+ Assert.assertTrue(false);
+ } catch (Exception e) {
+ Assert.assertTrue(true);
+ }
+ }
+
+ @Test
+ public void testRetrieveConnectionDetails() throws Exception {
+ shortInit();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+ ConnectionDetails connectionDetails1 = getConnectionDetails();
+ daoServiceMock.setConnection(connectionDetails1);
+
+ NetconfConnectionDetails connectionDetailsActual = netconfClientPlugin.retrieveConnectionDetails(VnfType.VNF);
+
+
+ Assert.assertEquals("wrong host", connectionDetails1.getHost(), connectionDetailsActual.getHost());
+ Assert.assertEquals("wrong password", connectionDetails1.getPassword(), connectionDetailsActual.getPassword());
+ Assert.assertEquals("wrong port", connectionDetails1.getPort(), connectionDetailsActual.getPort());
+ Assert.assertEquals("wrong usename", connectionDetails1.getUsername(), connectionDetailsActual.getUsername());
+ }
+
+
+ @Test
+ public void testRetrieveConnectionDetailsNegativeMissingConfiguration() throws Exception {
+ shortInit();
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+ ConnectionDetails connectionDetails1 = getConnectionDetails();
+ daoServiceMock.setConnection(connectionDetails1);
+
+ NetconfConnectionDetails connectionDetailsActual = null;
+ try {
+ connectionDetailsActual = netconfClientPlugin.retrieveConnectionDetails(VnfType.MOCK);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNull(connectionDetailsActual);
+ }
+
+
+ }
+
+ @Test
+ public void testRetrieveConfigurationFileContent() throws Exception {
+ shortInit();
+
+ DAOServiceMock daoServiceMock = (DAOServiceMock) dao;
+ daoServiceMock.setConfigFile(fileContent);
+
+ Assert.assertEquals("wrong config in a database", fileContent, netconfClientPlugin.retrieveConfigurationFileContent("VnfGetRunningConfig"));
+ }
+
+ private ConnectionDetails getConnectionDetails() {
+
+ ConnectionDetails connectionDetails = new ConnectionDetails();
+ connectionDetails.setPassword(password);
+ connectionDetails.setPort(port);
+ connectionDetails.setUsername(username);
+ connectionDetails.setHost(host);
+ return connectionDetails;
+ }
+
+
+ private void initDao() throws NoSuchFieldException, IllegalAccessException {
+ dao = new DAOServiceMock();
+ PowerMockito.mockStatic(FrameworkUtil.class);
+ when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService);
+ when(bundleService.getBundleContext()).thenReturn(bundleContext);
+ when(bundleContext.getServiceReference(NetconfDataAccessService.class)).thenReturn(sref1);
+ when(bundleContext.getService(sref1)).thenReturn(dao);
+
+
+ }
+
+ private void fullInit() throws NoSuchFieldException, IllegalAccessException {
+ initClientFactory();
+ initClientFactory2();
+ initDao();
+ netconfClientPlugin = new NetconfClientPluginImpl();
+ netconfClientPlugin.setDao(this.dao);
+ }
+
+ private void shortInit() throws NoSuchFieldException, IllegalAccessException {
+ initClientFactory();
+ initDao();
+ netconfClientPlugin = new NetconfClientPluginImpl();
+ netconfClientPlugin.setDao(this.dao);
+ }
+
+ private void initClientFactory() throws NoSuchFieldException, IllegalAccessException {
+
+ PowerMockito.mockStatic(FrameworkUtil.class);
+ when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService);
+ when(bundleService.getBundleContext()).thenReturn(bundleContext);
+ when(bundleContext.getServiceReference(NetconfClientFactory.class)).thenReturn(sref2);
+ when(bundleContext.getService(sref2)).thenReturn(clientFactory);
+
+ }
+
+ private void initClientFactory2() {
+ PowerMockito.mockStatic(FrameworkUtil.class);
+ when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService);
+ when(bundleService.getBundleContext()).thenReturn(bundleContext);
+ when(bundleContext.getServiceReference(Matchers.anyString())).thenReturn(sref3);
+ when(bundleContext.getService(sref3)).thenReturn(clientFactory);
+ }
+
+ private void substituteMapper(boolean command) throws NoSuchFieldException, IllegalAccessException {
+ ObjectMapper mapper = new ObjectMapperMock();
+ ObjectMapper mapper2 = new ObjectMapper();
+ Field field = NetconfClientPluginImpl.class.getDeclaredField("mapper");
+ field.setAccessible(true);
+ if (command) {
+ field.set(netconfClientPlugin, mapper);
+ } else {
+ field.set(netconfClientPlugin, mapper2);
+ }
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java
new file mode 100644
index 0000000..a591648
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java
@@ -0,0 +1,250 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.*;
+import org.openecomp.appc.adapter.netconf.ConnectionDetails;
+import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails;
+import org.openecomp.appc.adapter.netconf.NetconfDataAccessService;
+import org.openecomp.appc.adapter.netconf.exception.DataAccessException;
+import org.openecomp.appc.dg.netconf.impl.NetconfDBPluginImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.powermock.api.support.SuppressCode.suppressConstructor;
+
+public class NetconfDBPluginImplTest {
+ private NetconfDBPluginImpl netconfDBPlugin;
+ private NetconfDataAccessService daoService;
+ private DAOServiceMock daoMock;
+ private Map<String, String> params;
+ private static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+ String host = "http://www.test.com";
+ String host1 = "http://www.test1.com";
+ int port = 8080;
+ String username = "test";
+ String password = "test";
+ String configContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+ "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" +
+ "\t<get-config>\n" +
+ "\t\t<source>\n" +
+ "\t\t\t<running/>\n" +
+ "\t\t </source>\n" +
+ "\t</get-config>\n" +
+ "</rpc>'";
+
+
+ @Test
+ public void testRetrieveDSConfiguration() throws Exception {
+ init();
+ params = new HashMap<>();
+ params.put("org.openecomp.appc.vftype", "VNF");
+ params.put("configuration-file-name", "VnfGetRunningConfig");
+ SvcLogicContext ctx = new SvcLogicContext();
+ netconfDBPlugin.retrieveDSConfiguration(params, ctx);
+
+ Assert.assertEquals("lack of success of status", "success", ctx.getStatus());
+ Assert.assertEquals("wrong config file content", configContent, ctx.getAttribute("file-content"));
+ }
+
+
+ @Test
+ public void testRetrieveDSConfigurationNegativeErrorFieldNameDaoException() throws Exception {
+ init();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("configuration-file-name", "wrong");
+
+ try {
+ netconfDBPlugin.retrieveDSConfiguration(params, ctx);
+ } catch (DataAccessException e) {
+ //Assert.assertNotNull(ctx.getAttribute("org.openecomp.appc.dg.error"));
+ Assert.assertNull(ctx.getAttribute("file-content"));
+ }
+
+
+ }
+
+ @Test
+ public void testRetrieveVMDSConfiguration() throws Exception {
+ init();
+ params = new HashMap<>();
+ params.put("resourceKey", "VNF");
+ SvcLogicContext ctx = new SvcLogicContext();
+ netconfDBPlugin.retrieveVMDSConfiguration(params, ctx);
+
+ Assert.assertEquals("lack of success of retrieveVMDSConfiguration_Result", "success", ctx.getAttribute("retrieveVMDSConfiguration_Result"));
+ Assert.assertEquals("wrong entity", "VNF", ctx.getAttribute("entity"));
+ assertConnectionDetails(ctx, host);
+ }
+
+ @Test
+ public void testRetrieveVMDSConfigurationNegativeMissingConfiguration() throws Exception {
+ init();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("resourceKey", "MOCK");
+
+ try {
+ netconfDBPlugin.retrieveVMDSConfiguration(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+
+ Assert.assertEquals("failure", ctx.getAttribute("retrieveVMDSConfiguration_Result"));
+ }
+ }
+
+
+ @Test
+ public void testRetrieveVMDSConfigurationNegativeJsonProcessingException() throws Exception {
+
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("resourceKey", "VNF");
+
+ init();
+ substituteMapper(true);
+ try {
+ netconfDBPlugin.retrieveVMDSConfiguration(params, ctx);
+ substituteMapper(false);
+ Assert.assertTrue(false);
+
+ } catch (APPCException e) {
+ substituteMapper(false);
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+
+ }
+
+ }
+
+ @Test
+ public void testRetrieveConfigFile() throws Exception {
+ init();
+ SvcLogicContext ctx = new SvcLogicContext();
+ params = new HashMap<>();
+ params.put("configuration-file-name", "VnfGetRunningConfig");
+ netconfDBPlugin.retrieveConfigFile(params, ctx);
+
+ Assert.assertEquals("lack of success of status", "success", ctx.getStatus());
+ Assert.assertEquals("wrong config file content", configContent, ctx.getAttribute("file-content"));
+ }
+
+ @Test
+ public void testRetrieveConnectionDetails() throws Exception {
+ init();
+ params = new HashMap<>();
+ params.put("org.openecomp.appc.vftype", "VNF");
+ params.put("vnf-host-ip-address", host1);
+ SvcLogicContext ctx = new SvcLogicContext();
+ netconfDBPlugin.retrieveConnectionDetails(params, ctx);
+
+ assertConnectionDetails(ctx, host1);
+ }
+
+ @Test
+ public void testRetrieveConnectionDetailsNegativeJsonProcessingException() throws Exception {
+ init();
+ params = new HashMap<>();
+ params.put("org.openecomp.appc.vftype", "MOCK");
+ params.put("vnf-host-ip-address", host1);
+ SvcLogicContext ctx = new SvcLogicContext();
+
+ try {
+ netconfDBPlugin.retrieveConnectionDetails(params, ctx);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ Assert.assertNull(ctx.getAttribute("connection-details"));
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+ }
+
+
+ @Test
+ public void testRetrieveConnectionDetailsNegativeMissingConfiguration() throws Exception {
+ init();
+ params = new HashMap<>();
+ params.put("org.openecomp.appc.vftype", "VNF");
+ params.put("vnf-host-ip-address", host1);
+ SvcLogicContext ctx = new SvcLogicContext();
+ substituteMapper(true);
+
+ try {
+ netconfDBPlugin.retrieveConnectionDetails(params, ctx);
+ substituteMapper(false);
+ Assert.assertTrue(false);
+ } catch (APPCException e) {
+ substituteMapper(false);
+ Assert.assertNull(ctx.getAttribute("connection-details"));
+ Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE));
+ }
+
+ }
+
+ private void assertConnectionDetails(SvcLogicContext ctx, String host) throws IOException {
+ String sConnectionDetails = ctx.getAttribute("connection-details");
+ NetconfConnectionDetails connectionDetails = new ObjectMapper().readValue(sConnectionDetails, NetconfConnectionDetails.class);
+ Assert.assertEquals(host, connectionDetails.getHost());
+ Assert.assertEquals(port, connectionDetails.getPort());
+ Assert.assertEquals(username, connectionDetails.getUsername());
+ Assert.assertEquals(password, connectionDetails.getPassword());
+ Assert.assertNull(connectionDetails.getCapabilities());
+ Assert.assertNull(connectionDetails.getAdditionalProperties());
+ }
+
+ private void init() {
+ netconfDBPlugin = new NetconfDBPluginImpl();
+ daoService = new DAOServiceMock();
+ netconfDBPlugin.setDaoService(daoService);
+ daoMock = (DAOServiceMock) daoService;
+ daoMock.setConfigFile(configContent);
+ daoMock.setConnection(getConnectionDetails());
+
+ }
+
+ private ConnectionDetails getConnectionDetails() {
+ ConnectionDetails connectionDetails = new ConnectionDetails();
+ connectionDetails.setHost(host);
+ connectionDetails.setUsername(username);
+ connectionDetails.setPort(port);
+ connectionDetails.setPassword(password);
+ return connectionDetails;
+ }
+
+ private void substituteMapper(boolean command) throws NoSuchFieldException, IllegalAccessException {
+ ObjectMapper mapper = new ObjectMapperMock();
+ ObjectMapper mapper2 = new ObjectMapper();
+ Field field = NetconfDBPluginImpl.class.getDeclaredField("mapper");
+ field.setAccessible(true);
+ if (command) {
+ field.set(netconfDBPlugin, mapper);
+ } else {
+ field.set(netconfDBPlugin, mapper2);
+ }
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java
new file mode 100644
index 0000000..6a7da63
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+
+
+public class ObjectMapperMock extends ObjectMapper {
+
+ @Override
+ public String writeValueAsString(Object var1) throws JsonProcessingException {
+ throw new JsonProcessingException("") {
+ };
+
+ }
+
+ @Override
+ public <T> T readValue(String var1, Class<T> var2) throws IOException, JsonParseException, JsonMappingException {
+ return null;
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java
new file mode 100644
index 0000000..1dea8eb
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.netconf.impl;
+
+import org.apache.commons.lang3.NotImplementedException;
+import org.openecomp.appc.adapter.netconf.*;
+
+
+public class OperationStateValidatorFactoryMock extends OperationalStateValidatorFactory {
+ public static OperationalStateValidator getOperationalStateValidator(String vnfType) {
+ VnfType vnfTypeEnum = null;
+ try {
+ vnfTypeEnum = VnfType.getVnfType(vnfType);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException("Illegal value in vnfType. vnfType=" + vnfType, e);
+ }
+ return getOperationalStateValidator(vnfTypeEnum);
+ }
+
+ public static OperationalStateValidator getOperationalStateValidator(VnfType vnfType) {
+
+ return new MockOperationalStateValidatorImpl();
+
+
+ }
+
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/pom.xml
new file mode 100644
index 0000000..edaecc2
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/pom.xml
@@ -0,0 +1,85 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-shared-features</artifactId>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-ssh</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-netconf</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-aai</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-license-manager</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-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>
+ <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/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/src/main/resources/features.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/src/main/resources/features.xml
new file mode 100644
index 0000000..3271f7a
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-features/src/main/resources/features.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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-dg-shared-${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.openecomp.appc/appc-ssh-adapter-features/${project.version}/xml/features</repository>
+ <repository>mvn:org.openecomp.appc/appc-netconf-adapter-features/${project.version}/xml/features</repository>
+ <feature name='appc-dg-shared' description="appc-dg-shared" version='${project.version}'>
+ <feature version='${project.version}'>appc-ssh-adapter</feature>
+ <feature version='${project.version}'>appc-netconf-adapter</feature>
+ <bundle>mvn:org.openecomp.appc/appc-dg-common/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-dg-ssh/${project.version}</bundle>
+ <bundle start-level="85" start="true">mvn:org.openecomp.appc/appc-dg-netconf/${project.version}</bundle>
+ <bundle>mvn:org.openecomp.appc/appc-dg-license-manager/${project.version}</bundle>
+ <bundle start-level="85" start="true">mvn:org.openecomp.appc/appc-dg-aai/${project.version}</bundle>
+ </feature>
+</features>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/pom.xml
new file mode 100644
index 0000000..0a00e4a
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/pom.xml
@@ -0,0 +1,132 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-shared-installer</artifactId>
+ <name>APPC DG Shared - Karaf Installer</name>
+ <packaging>pom</packaging>
+
+ <properties>
+ <application.name>appc-dg-shared</application.name>
+ <features.boot>appc-dg-shared</features.boot>
+ <features.repositories>mvn:org.openecomp.appc/appc-dg-shared-features/${project.version}/xml/features</features.repositories>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-shared-features</artifactId>
+ <version>${project.version}</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-features</artifactId>
+ <version>${project.version}</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-netconf-adapter-features</artifactId>
+ <version>${project.version}</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>mavne-repo-zip</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <attach>false</attach>
+ <finalName>stage/${application.name}-${project.version}</finalName>
+ <descriptors>
+ <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ <execution>
+ <id>installer-zip</id>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <appendAssemblyId>false</appendAssemblyId>
+ <attach>true</attach>
+ <finalName>${application.name}-${project.version}</finalName>
+ <descriptors>
+ <descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <phase>prepare-package</phase>
+ <configuration>
+ <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ <useRepositoryLayout>true</useRepositoryLayout>
+ <addParentPoms>false</addParentPoms>
+ <copyPom>false</copyPom>
+ <excludeGroupIds>org.opendaylight</excludeGroupIds>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>copy-version</id>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <!-- here the phase you need -->
+ <phase>validate</phase>
+ <configuration>
+ <outputDirectory>${basedir}/target/stage</outputDirectory>
+ <resources>
+ <resource>
+ <directory>src/main/resources/scripts</directory>
+ <includes>
+ <include>install-feature.sh</include>
+ </includes>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_installer_zip.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 0000000..9fbaad8
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,59 @@
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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>adapter</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/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_mvnrepo_zip.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 0000000..1ac5a82
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,47 @@
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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>adapter</id>
+ <formats>
+ <format>zip</format>
+ </formats>
+
+ <!-- we want "system" and related files right at the root level
+ as this file is suppose to be unzip on top of a karaf
+ distro. -->
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+ <fileSets>
+ <fileSet>
+ <directory>target/assembly/</directory>
+ <outputDirectory>.</outputDirectory>
+ <excludes>
+ </excludes>
+ </fileSet>
+ </fileSets>
+
+</assembly>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/etc/org.apache.cxf.osgi.cfg b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/etc/org.apache.cxf.osgi.cfg
new file mode 100644
index 0000000..7ea1088
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/etc/org.apache.cxf.osgi.cfg
@@ -0,0 +1 @@
+org.apache.cxf.servlet.context=/actions
\ No newline at end of file
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/scripts/install-feature.sh b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 0000000..1d769fa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-shared-installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,40 @@
+###
+# ============LICENSE_START=======================================================
+# openECOMP : 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/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.gitignore b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.settings/org.eclipse.wst.common.project.facet.core.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..f4ef8aa
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/pom.xml
new file mode 100644
index 0000000..8a43155
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/pom.xml
@@ -0,0 +1,69 @@
+<?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-dg-shared</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-ssh</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-api</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-dg-common</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.openecomp.sdnc.core</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.appc</groupId>
+ <artifactId>appc-ssh-adapter-tests</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>appc-dg-ssh</Bundle-SymbolicName>
+ <Export-Package>org.openecomp.appc.dg.ssh</Export-Package>
+ <Private-Package>org.openecomp.appc.dg.ssh.impl.*</Private-Package>
+ <Import-Package>!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package>
+ <Embed-Dependency>appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency>
+ <Embed-Transitive>true</Embed-Transitive>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshDBPlugin.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshDBPlugin.java
new file mode 100644
index 0000000..71569bc
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshDBPlugin.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.ssh;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+public interface SshDBPlugin extends SvcLogicJavaPlugin {
+ void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshService.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshService.java
new file mode 100644
index 0000000..0d2927e
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/SshService.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.ssh;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+/**
+ * Set of common methods that can be called from DG.
+ */
+public interface SshService extends SvcLogicJavaPlugin {
+
+ /**
+ * Input parameter for SHH connection details
+ */
+ String PARAM_IN_connection_details = "connection_details";
+
+ /**
+ * Input parameter for SSH command to be executed.
+ */
+ String PARAM_IN_command = "command";
+
+ /*
+ String PARAM_IN_host = "host";
+ String PARAM_IN_port = "port";
+ String PARAM_IN_username = "username";
+ String PARAM_IN_password = "password";
+ */
+
+ /**
+ * Input parameter for SSH command timeout
+ */
+ String PARAM_IN_timeout = "timeout";
+
+ /**
+ * Output parameter - SSH command execution status.
+ */
+ String PARAM_OUT_status = "status";
+
+ /**
+ * Output parameter - content of SSH command stdout.
+ */
+ String PARAM_OUT_stdout = "stdout";
+
+ /**
+ * Output parameter - content of SSH command stderr.
+ */
+ String PARAM_OUT_stderr = "stderr";
+
+ /**
+ * Default SSH connection port.
+ */
+ int DEF_port = 22;
+
+ /**
+ * Default SSH command timeout
+ */
+ long DEF_timeout = 120000;
+
+ /**
+ * Default success status.
+ */
+ int DEF_SUCCESS_STATUS = 0;
+
+ /**
+ * Execute remote command over SSH.
+ *
+ * @param params contains list of input parameters required for the implementation
+ * @param ctx SLI service logic context
+ * @throws APPCException
+ */
+ void exec(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+
+ /**
+ * Execute remote command over SSH and check return status assuming that success status is 0.
+ * If non-zero status is returned - fail the execution by throwing exception with content written
+ * by command to stderr.
+ *
+ * @param params contains list of input parameters required for the implementation
+ * @param ctx SLI service logic context
+ * @throws APPCException
+ */
+ void execWithStatusCheck(Map<String, String> params, SvcLogicContext ctx) throws APPCException;
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshDBPluginImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshDBPluginImpl.java
new file mode 100644
index 0000000..382d418
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshDBPluginImpl.java
@@ -0,0 +1,74 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.ssh.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.Map;
+
+import org.openecomp.appc.adapter.ssh.Constants;
+import org.openecomp.appc.adapter.ssh.SshConnectionDetails;
+import org.openecomp.appc.adapter.ssh.SshDataAccessException;
+import org.openecomp.appc.adapter.ssh.SshDataAccessService;
+import org.openecomp.appc.dg.ssh.SshDBPlugin;
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+public class SshDBPluginImpl implements SshDBPlugin {
+
+ private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+ private static ObjectMapper mapper = new ObjectMapper();
+
+ private SshDataAccessService dataAccessService;
+
+ public void setDataAccessService(SshDataAccessService dataAccessService) {
+ this.dataAccessService = dataAccessService;
+ }
+
+ public void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ SshConnectionDetails connectionDetails = new SshConnectionDetails();
+ String vnfType = ctx.getAttribute("aai.prefix")+"."+"vnf-type";
+ try {
+ if (!dataAccessService.retrieveConnectionDetails(ctx.getAttribute(vnfType), connectionDetails)) {
+ logger.error("Missing configuration for " + params.get(vnfType));
+ throw new APPCException("Missing configuration for " + params.get(vnfType) + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME);
+ }
+ connectionDetails.setHost(params.get(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME));
+ ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails));
+ } catch(APPCException e) {
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw e;
+ } catch(SshDataAccessException e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw e;
+ } catch (JsonProcessingException e) {
+ logger.error("Error " + e.getMessage());
+ ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage());
+ throw new APPCException(e);
+ }
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshServiceImpl.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshServiceImpl.java
new file mode 100644
index 0000000..5066f0a
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/java/org/openecomp/appc/dg/ssh/impl/SshServiceImpl.java
@@ -0,0 +1,106 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.ssh.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Map;
+
+import org.openecomp.appc.adapter.ssh.SshAdapter;
+import org.openecomp.appc.adapter.ssh.SshConnection;
+import org.openecomp.appc.adapter.ssh.SshConnectionDetails;
+import org.openecomp.appc.dg.ssh.SshService;
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+
+public class SshServiceImpl implements SshService {
+
+ private static final EELFLogger logger = EELFManager.getInstance().getApplicationLogger();
+ private static final ObjectMapper mapper = new ObjectMapper();
+
+ private SshAdapter sshAdapter;
+
+ public void setSshAdapter(SshAdapter sshAdapter) {
+ this.sshAdapter = sshAdapter;
+ }
+
+ @Override
+ public void exec(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ SshConnectionDetails connectionDetails = resolveConnectionDetails(params.get(PARAM_IN_connection_details));
+ String command = params.get(PARAM_IN_command);
+ logger.debug("=> Connecting to SSH server...");
+ SshConnection sshConnection = sshAdapter.getConnection(connectionDetails.getHost(), connectionDetails.getPort(), connectionDetails.getUsername(), connectionDetails.getPassword());
+ sshConnection.connect();
+ try {
+ logger.debug("=> Connected to SSH server...");
+ logger.debug("=> Running SSH command...");
+ long timeout = DEF_timeout;
+ String stimeout = params.get(PARAM_IN_timeout);
+ if ((stimeout != null && !stimeout.isEmpty())) {
+ timeout = Long.parseLong(stimeout);
+ }
+ sshConnection.setExecTimeout(timeout);
+ ByteArrayOutputStream stdout = new ByteArrayOutputStream();
+ ByteArrayOutputStream stderr = new ByteArrayOutputStream();
+ int status = sshConnection.execCommand(command, stdout, stderr);
+ String stdoutRes = stdout.toString();
+ String stderrRes = stderr.toString();
+ logger.debug("=> executed SSH command");
+ ctx.setAttribute(PARAM_OUT_status, String.format("%01d", status));
+ ctx.setAttribute(PARAM_OUT_stdout, stdoutRes);
+ ctx.setAttribute(PARAM_OUT_stderr, stderrRes);
+ } finally {
+ sshConnection.disconnect();
+ }
+ }
+
+ private SshConnectionDetails resolveConnectionDetails(String connectionDetailsStr) throws APPCException {
+ SshConnectionDetails connectionDetails = null;
+ try {
+ connectionDetails = mapper.readValue(connectionDetailsStr, SshConnectionDetails.class);
+ if (0 == connectionDetails.getPort()) connectionDetails.setPort(DEF_port);
+ } catch (IOException e) {
+ throw new APPCException(e);
+ }
+ return connectionDetails;
+ }
+
+ @Override
+ public void execWithStatusCheck(Map<String, String> params, SvcLogicContext ctx) throws APPCException {
+ exec(params, ctx);
+ int status = Integer.parseInt(ctx.getAttribute(PARAM_OUT_status));
+ if(status != DEF_SUCCESS_STATUS) {
+ StringBuilder errmsg = new StringBuilder();
+ errmsg.append("SSH command returned error status [").append(status).append(']');
+ String stderr = ctx.getAttribute(PARAM_OUT_stderr);
+ if((stderr != null) && !stderr.isEmpty()) {
+ errmsg.append(". Error: [").append(stderr).append(']');
+ }
+ throw new APPCException(errmsg.toString());
+ }
+ }
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/resources/OSGI-INF/blueprint/blueprint.xml
new file mode 100644
index 0000000..11ab240
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ openECOMP : 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=========================================================
+ -->
+
+<!--
+ Starter Blueprint Camel Definition appc-aai-adapter-blueprint
+-->
+<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">
+
+ <reference id="sshAdapterRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.adapter.ssh.SshAdapter" />
+ <bean id="sshServiceBean" class="org.openecomp.appc.dg.ssh.impl.SshServiceImpl" scope="singleton">
+ <property name="sshAdapter" ref="sshAdapterRef" />
+ </bean>
+ <service id="sshService" interface="org.openecomp.appc.dg.ssh.SshService" ref="sshServiceBean"/>
+
+ <reference id="sshDAServiceRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.adapter.ssh.SshDataAccessService" />
+ <bean id="sshDBPluginBean" class="org.openecomp.appc.dg.ssh.impl.SshDBPluginImpl" scope="singleton">
+ <property name="dataAccessService" ref="sshDAServiceRef" />
+ </bean>
+ <service id="sshDBPlugin" interface="org.openecomp.appc.dg.ssh.SshDBPlugin" ref="sshDBPluginBean"/>
+
+</blueprint>
diff --git a/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/test/java/org/openecomp/appc/dg/ssh/impl/SshServiceImplTest.java b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/test/java/org/openecomp/appc/dg/ssh/impl/SshServiceImplTest.java
new file mode 100644
index 0000000..a00d211
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/appc-dg-ssh/src/test/java/org/openecomp/appc/dg/ssh/impl/SshServiceImplTest.java
@@ -0,0 +1,170 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : 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.dg.ssh.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.openecomp.appc.adapter.ssh.SshAdapterMock;
+import org.openecomp.appc.adapter.ssh.SshConnectionDetails;
+import org.openecomp.appc.adapter.ssh.SshConnectionMock;
+import org.openecomp.appc.dg.ssh.SshService;
+import org.openecomp.appc.dg.ssh.impl.SshServiceImpl;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+public class SshServiceImplTest {
+
+ private static final ObjectMapper mapper = new ObjectMapper();
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ @Test
+ public void testExec() throws APPCException, JsonProcessingException {
+ String host = "testhost";
+ String username = "testuser";
+ String password = "testpassword";
+ String command = "cat keystonerc_Test";
+
+ SshServiceImpl sshService = new SshServiceImpl();
+ SshAdapterMock sshAdapterMock = new SshAdapterMock();
+ sshService.setSshAdapter(sshAdapterMock);
+
+ System.out.println("=> Executing SSH command [" + command + "]...");
+
+ Map<String, String> params = new HashMap<>();
+ params.put(SshService.PARAM_IN_connection_details, createConnectionDetails(host,username,password));
+ params.put(SshService.PARAM_IN_command, command);
+ SvcLogicContext svcLogicContext = new SvcLogicContext(new Properties());
+ sshService.exec(params, svcLogicContext);
+ int status = Integer.parseInt(svcLogicContext.getAttribute(SshService.PARAM_OUT_status));
+ String stdout = svcLogicContext.getAttribute(SshService.PARAM_OUT_stdout);
+ String stderr = svcLogicContext.getAttribute(SshService.PARAM_OUT_stderr);
+ System.out.println("=> SSH command [" + command + "] status is [" + status + "]. stdout is [" + stdout + "]. stderr is [" + stderr + "]");
+
+ List<SshConnectionMock> connectionMocks = sshAdapterMock.getConnectionMocks();
+ Assert.assertEquals(1, connectionMocks.size());
+ SshConnectionMock connectionMock = connectionMocks.get(0);
+ Assert.assertNotNull(connectionMock);
+ Assert.assertEquals(host, connectionMock.getHost());
+ Assert.assertEquals(SshService.DEF_port, connectionMock.getPort());
+ Assert.assertEquals(username, connectionMock.getUsername());
+ Assert.assertEquals(password, connectionMock.getPassword());
+ Assert.assertEquals(1, connectionMock.getConnectCallCount());
+ Assert.assertEquals(1, connectionMock.getDisconnectCallCount());
+ List<String> executedCommands = connectionMock.getExecutedCommands();
+ Assert.assertEquals(1, executedCommands.size());
+ String executedCommand = executedCommands.get(0);
+ Assert.assertEquals(command, executedCommand);
+ }
+
+ @Test
+ public void testExecWithStatusCheck() throws APPCException, JsonProcessingException {
+ String host = "testhost";
+ String username = "testuser";
+ String password = "testpassword";
+ String command = "cat keystonerc_Test";
+
+ SshServiceImpl sshService = new SshServiceImpl();
+ SshAdapterMock sshAdapterMock = new SshAdapterMock();
+ sshService.setSshAdapter(sshAdapterMock);
+
+ System.out.println("=> Executing SSH command [" + command + "]...");
+ Map<String, String> params = new HashMap<>();
+ params.put(SshService.PARAM_IN_connection_details, createConnectionDetails(host,username,password));
+ params.put(SshService.PARAM_IN_command, command);
+ SvcLogicContext svcLogicContext = new SvcLogicContext(new Properties());
+ sshService.execWithStatusCheck(params, svcLogicContext);
+ int status = Integer.parseInt(svcLogicContext.getAttribute(SshService.PARAM_OUT_status));
+ String stdout = svcLogicContext.getAttribute(SshService.PARAM_OUT_stdout);
+ String stderr = svcLogicContext.getAttribute(SshService.PARAM_OUT_stderr);
+ System.out.println("=> SSH command [" + command + "] status is [" + status + "]. stdout is [" + stdout + "]. stderr is [" + stderr + "]");
+
+ List<SshConnectionMock> connectionMocks = sshAdapterMock.getConnectionMocks();
+ Assert.assertEquals(1, connectionMocks.size());
+ SshConnectionMock connectionMock = connectionMocks.get(0);
+ Assert.assertNotNull(connectionMock);
+ Assert.assertEquals(host, connectionMock.getHost());
+ Assert.assertEquals(SshService.DEF_port, connectionMock.getPort());
+ Assert.assertEquals(username, connectionMock.getUsername());
+ Assert.assertEquals(password, connectionMock.getPassword());
+ Assert.assertEquals(1, connectionMock.getConnectCallCount());
+ Assert.assertEquals(1, connectionMock.getDisconnectCallCount());
+ List<String> executedCommands = connectionMock.getExecutedCommands();
+ Assert.assertEquals(1, executedCommands.size());
+ String executedCommand = executedCommands.get(0);
+ Assert.assertEquals(command, executedCommand);
+ }
+
+ /**
+ * Checks that execWithStatusCheck() throws appropriate exception if execution status != 0.
+ *
+ * @throws APPCException
+ * @throws JsonProcessingException
+ */
+ @Test
+ public void testExecWithStatusCheckFail() throws APPCException, JsonProcessingException {
+ String host = "testhost";
+ String username = "testuser";
+ String password = "testpassword";
+ String command = "cat keystonerc_Test";
+
+ int expectedStatus = 2;
+ String expectedErr = "Test failure";
+
+ SshServiceImpl sshService = new SshServiceImpl();
+ SshAdapterMock sshAdapterMock = new SshAdapterMock();
+ sshAdapterMock.setReturnStatus(expectedStatus);
+ sshAdapterMock.setReturnStderr(expectedErr);
+ sshService.setSshAdapter(sshAdapterMock);
+
+ thrown.expect(APPCException.class);
+ thrown.expectMessage(CoreMatchers.containsString(expectedErr));
+
+ System.out.println("=> Executing SSH command [" + command + "]...");
+ Map<String, String> params = new HashMap<>();
+ params.put(SshService.PARAM_IN_connection_details, createConnectionDetails(host,username,password));
+ params.put(SshService.PARAM_IN_command, command);
+ SvcLogicContext svcLogicContext = new SvcLogicContext(new Properties());
+ // should fail, no need to perform further assertions
+ sshService.execWithStatusCheck(params, svcLogicContext);
+ }
+
+ private String createConnectionDetails(String host, String username, String password) throws JsonProcessingException {
+ SshConnectionDetails connDetails = new SshConnectionDetails();
+ connDetails.setHost(host);
+ connDetails.setUsername(username);
+ connDetails.setPassword(password);
+ return mapper.writeValueAsString(connDetails);
+ }
+
+}
diff --git a/app-c/appc/appc-dg/appc-dg-shared/pom.xml b/app-c/appc/appc-dg/appc-dg-shared/pom.xml
new file mode 100644
index 0000000..f2058bf
--- /dev/null
+++ b/app-c/appc/appc-dg/appc-dg-shared/pom.xml
@@ -0,0 +1,21 @@
+<?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-dg</artifactId>
+ <version>1.0.0</version>
+ </parent>
+ <artifactId>appc-dg-shared</artifactId>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>appc-dg-common</module>
+ <module>appc-dg-ssh</module>
+ <module>appc-dg-aai</module>
+ <module>appc-dg-netconf</module>
+ <module>appc-dg-license-manager</module>
+ <module>appc-dg-shared-features</module>
+ <module>appc-dg-shared-installer</module>
+ </modules>
+</project>
diff --git a/app-c/appc/appc-dg/pom.xml b/app-c/appc/appc-dg/pom.xml
new file mode 100644
index 0000000..f0748db
--- /dev/null
+++ b/app-c/appc/appc-dg/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>appc</artifactId>
+ <groupId>org.openecomp.appc</groupId>
+ <version>1.0.0</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>appc-dg</artifactId>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>appc-dg-shared</module>
+ </modules>
+</project>