Merge of new rebased code

Change-Id: I9b8d1f69eb3e0af1935ed8304fea4bf54c1aac47
Signed-off-by: Patrick Brady <pb071s@att.com>
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/.gitignore b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/.gitignore
new file mode 100644
index 0000000..755cdc3
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/.gitignore
@@ -0,0 +1,3 @@
+/bin/
+/target/
+/.settings/
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/pom.xml b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/pom.xml
new file mode 100644
index 0000000..094ca9a
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/pom.xml
@@ -0,0 +1,223 @@
+<?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-rest-healthcheck-adapter</artifactId>
+		<version>1.1.0-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>appc-rest-healthcheck-adapter-bundle</artifactId>
+	<packaging>bundle</packaging>
+	<name>rest healthcheck Adapter - bundle</name>
+
+	<dependencies>
+		<dependency>
+			<groupId>commons-codec</groupId>
+			<artifactId>commons-codec</artifactId>
+		</dependency>
+		<!-- http://mvnrepository.com/artifact/commons-logging/commons-logging -->
+		<dependency>
+			<groupId>commons-logging</groupId>
+			<artifactId>commons-logging</artifactId>
+			<version>1.2</version>
+		</dependency>
+		<!-- http://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpcore</artifactId>
+			<version>4.4.4</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.5.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcpkix-jdk15on</artifactId>
+			<version>1.47</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcprov-jdk15on</artifactId>
+			<version>1.47</version>
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.appc</groupId>
+			<artifactId>appc-common</artifactId>
+			<version>${project.version}</version>
+			<classifier>jar-with-dependencies</classifier>
+			<scope>compile</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.openecomp.appc</groupId>
+			<artifactId>appc-common</artifactId>
+			<version>${project.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>javax</groupId>
+			<artifactId>javaee-api</artifactId>
+			<version>7.0</version>
+		</dependency>
+
+
+		<dependency>
+			<groupId>com.att.cdp</groupId>
+			<artifactId>cdp-pal-common</artifactId>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>com.att.cdp</groupId>
+			<artifactId>cdp-pal-openstack</artifactId>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.ws.rs</groupId>
+			<artifactId>javax.ws.rs-api</artifactId>
+		</dependency>
+
+		<!-- Jersey support needed for OpenStack connector and API version logic -->
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-client</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-json</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>jaxb-api</artifactId>
+			<version>2.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>javax.xml</groupId>
+			<artifactId>jaxp-api</artifactId>
+			<version>1.4.2</version>
+		</dependency>
+
+		<!-- Needed to run test cases -->
+		<dependency>
+			<groupId>org.glassfish.jersey.core</groupId>
+			<artifactId>jersey-common</artifactId>
+			<version>2.9.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.codehaus.jackson</groupId>
+			<artifactId>jackson-jaxrs</artifactId>
+			<version>1.9.12</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.5.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sli-common</artifactId>
+			<scope>compile</scope>
+			<!-- Added exclusion to prevent missing dependency issue on dblib -->
+			<exclusions>
+				<exclusion>
+					<groupId>org.openecomp.sdnc.core</groupId>
+					<artifactId>dblib-provider</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.openecomp.sdnc.core</groupId>
+			<artifactId>sli-provider</artifactId>
+			<scope>compile</scope>
+			<!-- Added exclusion to prevent missing dependency issue on dblib -->
+			<exclusions>
+				<exclusion>
+					<groupId>org.openecomp.sdnc.core</groupId>
+					<artifactId>dblib-provider</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>equinoxSDK381</groupId>
+			<artifactId>org.eclipse.osgi</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jcl-over-slf4j</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.31</version>
+			<type>jar</type>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>com.vmware</groupId>
+			<artifactId>vijava</artifactId>
+			<version>5.1</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>xerces</groupId>
+			<artifactId>xerces</artifactId>
+			<version>2.4.0</version>
+			<scope>provided</scope>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.felix</groupId>
+				<artifactId>maven-bundle-plugin</artifactId>
+				<extensions>true</extensions>
+				<configuration>
+					<instructions>
+						<Bundle-SymbolicName>appc-rest-healthcheck-adapter</Bundle-SymbolicName>
+						<Bundle-Activator>org.openecomp.appc.adapter.restHealthcheck.RestHealthcheckActivator</Bundle-Activator>
+						<Export-Package>org.openecomp.appc.adapter.restHealthcheck</Export-Package>
+						<Import-Package>
+							org.openecomp.sdnctl.sli.*,org.osgi.framework.*,org.slf4j.*,com.vmware.*,org.apache.xerces.*,javax.net.*,javax.net.ssl.*,org.xml.sax.*,javax.xml.bind.*,javax.naming.*,javax.security.auth.*
+						</Import-Package>
+						<Embed-Dependency>
+							*;scope=compile|runtime;artifactId=!sli-common|!appc-common|org.eclipse.osgi|slf4j-api|jcl-over-slf4j|xml-apis
+						</Embed-Dependency>
+						<Embed-Transitive>true</Embed-Transitive>
+					</instructions>
+
+					<manifestLocation>${project.basedir}/src/main/resources/META-INF</manifestLocation>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckActivator.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckActivator.java
new file mode 100644
index 0000000..a6c9c3f
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckActivator.java
@@ -0,0 +1,113 @@
+
+/*-
+ * ============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.adapter.restHealthcheck;
+
+import org.openecomp.appc.Constants;
+import org.openecomp.appc.adapter.restHealthcheck.impl.RestHealthcheckAdapterImpl;
+import org.openecomp.appc.configuration.Configuration;
+import org.openecomp.appc.configuration.ConfigurationFactory;
+import org.openecomp.appc.i18n.Msg;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+public class RestHealthcheckActivator implements BundleActivator {
+
+    /**
+     * The bundle registration
+     */
+    private ServiceRegistration registration = null;
+
+    /**
+     * The reference to the actual implementation object that implements the services
+     */
+    private RestHealthcheckAdapter adapter;
+
+    private static final EELFLogger logger = EELFManager.getInstance().getLogger(RestHealthcheckActivator.class);
+
+    /**
+     * The configuration object used to configure this bundle
+     */
+    private Configuration configuration;
+
+    /**
+     * Called when this bundle is started so the Framework can perform the bundle-specific activities necessary to start
+     * this bundle. This method can be used to register services or to allocate any resources that this bundle needs.
+     * <p>
+     * This method must complete and return to its caller in a timely manner.
+     * </p>
+     * 
+     * @param context
+     *            The execution context of the bundle being started.
+     * @throws java.lang.Exception
+     *             If this method throws an exception, this bundle is marked as stopped and the Framework will remove
+     *             this bundle's listeners, unregister all services registered by this bundle, and release all services
+     *             used by this bundle.
+     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void start(BundleContext context) throws Exception {
+        logger.info("Starting bundle " + getName());
+
+        adapter = new RestHealthcheckAdapterImpl();
+        if (registration == null) {
+            registration = context.registerService(RestHealthcheckAdapter.class, adapter, null);
+        }
+
+    }
+
+    /**
+     * Called when this bundle is stopped so the Framework can perform the bundle-specific activities necessary to stop
+     * the bundle. In general, this method should undo the work that the BundleActivator.start method started. There
+     * should be no active threads that were started by this bundle when this bundle returns. A stopped bundle must not
+     * call any Framework objects.
+     * <p>
+     * This method must complete and return to its caller in a timely manner.
+     * </p>
+     * 
+     * @param context
+     *            The execution context of the bundle being stopped.
+     * @throws java.lang.Exception
+     *             If this method throws an exception, the bundle is still marked as stopped, and the Framework will
+     *             remove the bundle's listeners, unregister all services registered by the bundle, and release all
+     *             services used by the bundle. *
+     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        logger.info("Stopping bundle " + getName());
+
+        if (registration != null) {
+
+            registration.unregister();
+            registration = null;
+
+        }
+    }
+
+    public String getName() {
+        return "APPC Rest Healthcheck adapter";
+    }
+
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckAdapter.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckAdapter.java
new file mode 100644
index 0000000..87cd02e
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/RestHealthcheckAdapter.java
@@ -0,0 +1,48 @@
+/*-
+ * ============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.adapter.restHealthcheck;
+
+import java.util.Map;
+
+import org.openecomp.appc.exceptions.APPCException;
+import com.att.cdp.zones.model.Server;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+
+public interface RestHealthcheckAdapter extends SvcLogicJavaPlugin {
+
+
+    static final String PROPERTY_PROVIDER_TYPE = "org.openecomp.appc.provider.type";
+
+
+    static final String PROPERTY_PROVIDER_NAME = "org.openecomp.appc.provider.name";
+
+    static final String PROPERTY_INSTANCE_URL = "org.openecomp.appc.instance.url";
+
+
+    static final String PROPERTY_IDENTITY_URL = "org.openecomp.appc.identity.url";
+
+    String getAdapterName();
+
+    void checkHealth(Map<String, String> params, SvcLogicContext ctx) ;
+
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestContext.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestContext.java
new file mode 100644
index 0000000..975a9c3
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestContext.java
@@ -0,0 +1,246 @@
+/*-
+ * ============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.adapter.restHealthcheck.impl;
+
+import org.openecomp.appc.Constants;
+import org.openecomp.appc.configuration.Configuration;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+public class RequestContext {
+    /**
+     * The number of seconds of wait time between successive attempts to connect to the provider. This is used to
+     * recover from provider outages or failures. It is not used to recover from logical errors, such as an invalid
+     * request, server not found, etc.
+     */
+    private Integer retryDelay;
+
+    /**
+     * The number of times we will attempt to connect to the provider. This is used to recover from provider outages or
+     * failures. It is not used to recover from logical errors, such as an invalid request, server not found, etc.
+     */
+    private Integer retryLimit;
+
+    /**
+     * The total time, in milliseconds, that the provider can have to process this request. If the accumulated time
+     * exceeds the time to live, then the request is failed with a timeout exception, regardless of the state of the
+     * provider. Note that the caller may supply this as a value in seconds, in which case it must be converted to
+     * milliseconds for the request context.
+     */
+    private Long timeToLive;
+
+    /**
+     * The accumulated time, in milliseconds, that has been used so far to process the request. This is compared to the
+     * time to live each time it is updated. If the accumulated time exceeds the time to live, then the request is
+     * failed with a timeout exception, regardless of the state of the provider.
+     */
+    private long accumulatedTime;
+
+    /**
+     * The total number of retries attempted so far
+     */
+    private int attempt;
+
+    /**
+     * The time when the stopwatch was started
+     */
+    private long startTime = -1;
+
+    /**
+     * The service logic (DG) context from the SLI
+     */
+    private SvcLogicContext svcLogicContext;
+
+    /**
+     * The configuration
+     */
+
+
+    /**
+     * Set to true whenever the retry limit has been exceeded, reset to false when reset() is called.
+     */
+    private boolean retryFailed;
+
+    /**
+     * Creates the request context
+     * 
+     * @param context
+     *            The service logic (SLI) context associated with the current DG
+     */
+    public RequestContext(SvcLogicContext context) {
+        setSvcLogicContext(context);
+    }
+
+    /**
+     * @return The retry delay, in seconds. If zero, then no retry is to be performed
+     */
+    public int getRetryDelay() {
+        if (retryDelay == null) {
+            int value = 10;
+            retryDelay = Integer.valueOf(value);
+        }
+
+        return retryDelay.intValue();
+    }
+
+    /**
+     * This method is a helper that allows the caller to delay for the retry interval time and not have to handle the
+     * thread interruption, timer handling, etc.
+     */
+    public void delay() {
+        long time = getRetryDelay() * 1000L;
+        long future = System.currentTimeMillis() + time;
+        if (time != 0) {
+            while (System.currentTimeMillis() < future && time > 0) {
+                try {
+                    Thread.sleep(time);
+                } catch (InterruptedException e) {
+                    /*
+                     * This is rare, but it can happen if another thread interrupts us while we are sleeping. In that
+                     * case, the thread is resumed before the delay time has actually expired, so re-calculate the
+                     * amount of delay time needed and reenter the sleep until we get to the future time.
+                     */
+                    time = future - System.currentTimeMillis();
+                }
+            }
+        }
+    }
+
+    /**
+     * @return The number of retries that are allowed per connection
+     */
+    public int getRetryLimit() {
+        if (retryLimit == null) {
+            int value = 10;
+            retryLimit = Integer.valueOf(value);
+        }
+
+        return retryLimit.intValue();
+    }
+
+    /**
+     * Check and count the connection attempt.
+     * 
+     * @return True if the connection should be attempted. False indicates that the number of retries has been exhausted
+     *         and it should NOT be attempted.
+     */
+    public boolean attempt() {
+        if (retryFailed || attempt >= getRetryLimit()) {
+            retryFailed = true;
+            return false;
+        }
+        attempt++;
+
+        return true;
+    }
+
+    /**
+     * @return The number of retry attempts so far
+     */
+    public int getAttempts() {
+        return attempt;
+    }
+
+    /**
+     * @return True if the retry limit has been exceeded, false otherwise
+     */
+    public boolean isFailed() {
+        return retryFailed;
+    }
+
+    /**
+     * This method both checks the time to live to see if it has been exceeded and accumulates the total time used so
+     * far.
+     * <p>
+     * Each time this method is called it accumulates the total duration since the last time it was called to the total
+     * time accumulator. It then checks the total time to the time to live and if greater, it returns false. As long as
+     * the total time used is less than or equal to the time to live limit, the method returns true. It is important to
+     * call this method at the very beginning of the process so that all parts of the process are tracked.
+     * </p>
+     * 
+     * @return True if the total time to live has not been exceeded. False indicates that the total time to live has
+     *         been exceeded and no further processing should be performed.
+     */
+    public boolean isAlive() {
+        long now = System.currentTimeMillis();
+        if (startTime == -1) {
+            startTime = now;
+            return true;
+        }
+        accumulatedTime += (now - startTime);
+        startTime = now;
+        if (accumulatedTime > timeToLive) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @return The total amount of time used, in milliseconds.
+     */
+    public long getTotalDuration() {
+        return accumulatedTime;
+    }
+
+    /**
+     * This method is called to reset the retry counters. It has no effect on the time to live accumulator.
+     */
+    public void reset() {
+        attempt = 0;
+    }
+
+    /**
+     * Sets the time to live to the value, expressed in seconds
+     * 
+     * @param time
+     *            The time to live, in seconds
+     */
+    public void setTimeToLiveSeconds(int time) {
+        setTimeToLiveMS(time * 1000L);
+    }
+
+    /**
+     * Sets the time to live to the value, expressed in milliseconds
+     * 
+     * @param time
+     *            The time to live, in milliseconds
+     */
+    public void setTimeToLiveMS(long time) {
+        this.timeToLive = time;
+    }
+
+    /**
+     * @return The service logic context associated with this request
+     */
+    public SvcLogicContext getSvcLogicContext() {
+        return svcLogicContext;
+    }
+
+    /**
+     * @param svcLogicContext
+     *            The service logic context to be associated with this request
+     */
+    public void setSvcLogicContext(SvcLogicContext svcLogicContext) {
+        this.svcLogicContext = svcLogicContext;
+    }
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestFailedException.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestFailedException.java
new file mode 100644
index 0000000..b4a6d29
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RequestFailedException.java
@@ -0,0 +1,241 @@
+/*-
+ * ============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.adapter.restHealthcheck.impl;
+
+import org.glassfish.grizzly.http.util.HttpStatus;
+
+import com.att.cdp.zones.model.Server;
+
+
+public class RequestFailedException extends Exception {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The operation that was being requested or performed at the time of the failure.
+     */
+    private String operation;
+
+    /**
+     * A message that details the reason for the failure
+     */
+    private String reason;
+
+    /**
+     * The server that was being operated upon
+     */
+    private Server server;
+
+    /**
+     * The id of the server being operated upon if the server object is not available (such as the server was not found)
+     */
+    private String serverId;
+
+    /**
+     * The most appropriate Http Status code that reflects the error
+     */
+    private HttpStatus status;
+
+    /**
+     * 
+     */
+    public RequestFailedException() {
+        // intentionally empty
+    }
+
+    /**
+     * @param message
+     *            The error message
+     */
+    public RequestFailedException(String message) {
+        super(message);
+    }
+
+    /**
+     * Construct the request failed exception with the operation being performed, reason for the failure, http status
+     * code that is most appropriate, and the server we were processing.
+     * 
+     * @param operation
+     *            The operation being performed
+     * @param reason
+     *            The reason that the operation was failed
+     * @param status
+     *            The http status code that is most appropriate
+     * @param server
+     *            The server that we were processing
+     */
+    @SuppressWarnings("nls")
+    public RequestFailedException(String operation, String reason, HttpStatus status, Server server) {
+        super(operation + ":" + reason);
+        this.operation = operation;
+        this.reason = reason;
+        this.status = status;
+        this.server = server;
+        if (server != null) {
+            this.serverId = server.getId();
+        }
+    }
+
+    /**
+     * Construct the request failed exception with the operation being performed, reason for the failure, http status
+     * code that is most appropriate, and the server we were processing.
+     * 
+     * @param ex
+     *            The exception that we are wrapping
+     * @param operation
+     *            The operation being performed
+     * @param reason
+     *            The reason that the operation was failed
+     * @param status
+     *            The http status code that is most appropriate
+     * @param server
+     *            The server that we were processing
+     */
+    @SuppressWarnings("nls")
+    public RequestFailedException(Throwable ex, String operation, String reason, HttpStatus status, Server server) {
+        super(operation + ":" + reason, ex);
+        this.operation = operation;
+        this.reason = reason;
+        this.status = status;
+        this.server = server;
+        if (server != null) {
+            this.serverId = server.getId();
+        }
+    }
+
+    /**
+     * @param message
+     *            The error message
+     * @param cause
+     *            A nested exception
+     */
+    public RequestFailedException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * @param message
+     *            The error message
+     * @param cause
+     *            A nested exception
+     * @param enableSuppression
+     *            whether or not suppression is enabled or disabled
+     * @param writableStackTrace
+     *            whether or not the stack trace should be writable
+     */
+    public RequestFailedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+
+    /**
+     * @param cause
+     *            the cause (which is saved for later retrieval by the {@link #getCause()} method). (A null value is
+     *            permitted, and indicates that the cause is nonexistent or unknown.)
+     */
+    public RequestFailedException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * @return The operation being performed
+     */
+    public String getOperation() {
+        return operation;
+    }
+
+    /**
+     * @return The reason for the failure
+     */
+    public String getReason() {
+        return reason;
+    }
+
+    /**
+     * @return The server being operated upon
+     */
+    public Server getServer() {
+        return server;
+    }
+
+    /**
+     * @return The id of the server being operated upon
+     */
+    public String getServerId() {
+        return serverId;
+    }
+
+    /**
+     * @return The status code from the operation
+     */
+    public HttpStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * @param operation
+     *            The operation being performed
+     */
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    /**
+     * @param reason
+     *            The reason for the failure
+     */
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    /**
+     * @param server
+     *            The server being operated upon
+     */
+    public void setServer(Server server) {
+        this.server = server;
+        if (server != null) {
+            setServerId(server.getId());
+        }
+    }
+
+    /**
+     * @param serverId
+     *            The id of the server being operated upon
+     */
+    public void setServerId(String serverId) {
+        this.serverId = serverId;
+    }
+
+    /**
+     * @param status
+     *            The status of the request
+     */
+    public void setStatus(HttpStatus status) {
+        this.status = status;
+    }
+
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RestHealthcheckAdapterImpl.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RestHealthcheckAdapterImpl.java
new file mode 100644
index 0000000..13bc81a
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/java/org/openecomp/appc/adapter/restHealthcheck/impl/RestHealthcheckAdapterImpl.java
@@ -0,0 +1,336 @@
+/*-
+ * ============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.adapter.restHealthcheck.impl;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.openecomp.appc.Constants;
+import org.openecomp.appc.adapter.restHealthcheck.RestHealthcheckAdapter;
+import org.openecomp.appc.configuration.Configuration;
+import org.openecomp.appc.configuration.ConfigurationFactory;
+import org.openecomp.appc.exceptions.APPCException;
+import org.openecomp.appc.exceptions.UnknownProviderException;
+import org.openecomp.appc.i18n.Msg;
+import org.openecomp.appc.pool.Pool;
+import org.openecomp.appc.pool.PoolExtensionException;
+import org.openecomp.appc.util.StructuredPropertyHelper;
+import org.openecomp.appc.util.StructuredPropertyHelper.Node;
+
+
+import com.att.cdp.exceptions.ContextConnectionException;
+import com.att.cdp.exceptions.ResourceNotFoundException;
+import com.att.cdp.exceptions.TimeoutException;
+import com.att.cdp.exceptions.ZoneException;
+import com.att.cdp.pal.util.StringHelper;
+import com.att.cdp.zones.ComputeService;
+import com.att.cdp.zones.Context;
+import com.att.cdp.zones.ImageService;
+import com.att.cdp.zones.Provider;
+import com.att.cdp.zones.model.Image;
+import com.att.cdp.zones.model.Server;
+import com.att.cdp.zones.model.Server.Status;
+import com.att.cdp.zones.model.ServerBootSource;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import org.openecomp.sdnc.sli.SvcLogicContext;
+
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.slf4j.MDC;
+
+import java.net.InetAddress;
+import java.util.Locale;
+import java.util.UUID;
+import static com.att.eelf.configuration.Configuration.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.client.methods.*;
+import org.apache.http.impl.client.*;
+import org.apache.http.util.EntityUtils;
+import java.io.IOException;
+import org.apache.http.entity.StringEntity;
+import java.net.InetAddress;
+
+public class RestHealthcheckAdapterImpl implements RestHealthcheckAdapter {
+
+	/**
+	 * The constant used to define the adapter name in the mapped diagnostic
+	 * context
+	 */
+
+
+	@SuppressWarnings("nls")
+	public static final String MDC_ADAPTER = "adapter";
+
+	/**
+	 * The constant used to define the service name in the mapped diagnostic
+	 * context
+	 */
+	@SuppressWarnings("nls")
+	public static final String MDC_SERVICE = "service";
+
+	/**
+	 * The constant for the status code for a failed outcome
+	 */
+	@SuppressWarnings("nls")
+	public static final String OUTCOME_FAILURE = "failure";
+
+	/**
+	 * The constant for the status code for a successful outcome
+	 */
+	@SuppressWarnings("nls")
+	public static final String OUTCOME_SUCCESS = "success";
+
+	/**
+	 * A constant for the property token "provider" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER = "provider";
+
+	/**
+	 * A constant for the property token "identity" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_IDENTITY = "identity";
+
+	/**
+	 * A constant for the property token "name" used in the structured property
+	 * specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_NAME = "name";
+
+	/**
+	 * A constant for the property token "tenant" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_TENANT = "tenant";
+
+	/**
+	 * A constant for the property token "tenant name" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_TENANT_NAME = "name";
+
+	/**
+	 * A constant for the property token "password" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_TENANT_PASSWORD = "password"; // NOSONAR
+
+	/**
+	 * A constant for the property token "userid" used in the structured
+	 * property specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_TENANT_USERID = "userid";
+
+	/**
+	 * A constant for the property token "type" used in the structured property
+	 * specifications
+	 */
+	@SuppressWarnings("nls")
+	public static final String PROPERTY_PROVIDER_TYPE = "type";
+
+
+	@SuppressWarnings("nls")
+	public static final String PING_SERVICE = "pingServer";
+
+	/**
+	 * The logger to be used
+	 */
+	private static final EELFLogger logger = EELFManager.getInstance().getLogger(RestHealthcheckAdapterImpl.class);
+
+	/**
+	 * The constant for a left parenthesis
+	 */
+	private static final char LPAREN = '(';
+
+	/**
+	 * The constant for a new line control code
+	 */
+	private static final char NL = '\n';
+
+	/**
+	 * The constant for a single quote
+	 */
+	private static final char QUOTE = '\'';
+
+	/**
+	 * The constant for a right parenthesis
+	 */
+	private static final char RPAREN = ')';
+
+	/**
+	 * The constant for a space
+	 */
+	private static final char SPACE = ' ';
+
+	/**
+	 * A reference to the adapter configuration object.
+	 */
+	private Configuration configuration;
+
+	/**
+	 * A cache of providers that are predefined.
+	 */
+	// private Map<String /* provider name */, ProviderCache> providerCache;
+
+	/**
+	 * This default constructor is used as a work around because the activator
+	 * wasnt getting called
+	 */
+	/**
+	 * A cache of providers that are predefined.
+	 */
+	// private Map<String /* provider name */, ProviderCache> providerCache;
+
+	/**
+	 * This default constructor is used as a work around because the activator
+	 * wasnt getting called
+	 */
+	public RestHealthcheckAdapterImpl() {
+		initialize();
+
+	}
+
+
+	public RestHealthcheckAdapterImpl(boolean initialize) {
+
+		if (initialize) {
+			initialize();
+
+		}
+	}
+
+
+	public RestHealthcheckAdapterImpl(Properties props) {
+		initialize();
+
+	}
+
+
+	@Override
+	public String getAdapterName() {
+		return configuration.getProperty(Constants.PROPERTY_ADAPTER_NAME);
+	}
+
+	public void checkHealth(Map<String, String> params, SvcLogicContext ctx) {
+		logger.info("VNF rest health check");
+		String uri=params.get("VNF.URI");
+		String endPoint=params.get("VNF.endpoint");
+		String tUrl=uri+"/"+endPoint;
+		RequestContext rc = new RequestContext(ctx);
+		rc.isAlive();
+
+		try {
+			HttpGet httpGet = new HttpGet(tUrl);
+			HttpClient httpClient = HttpClients.createDefault();
+			HttpResponse response = null;
+			response = httpClient.execute(httpGet);
+			int responseCode=response.getStatusLine().getStatusCode();
+			HttpEntity entity = response.getEntity();
+			String responseOutput=EntityUtils.toString(entity);
+			if(responseCode==200)
+			{
+				doSuccess(rc,responseCode,responseOutput);
+			}
+			else
+			{
+				doHealthCheckFailure(rc,responseCode,responseOutput);
+			}
+		} catch (Exception ex) {
+			doFailure(rc, HttpStatus.INTERNAL_SERVER_ERROR_500, ex.toString());
+		}
+	}
+
+
+
+
+	@SuppressWarnings("static-method")
+	private void doFailure(RequestContext rc, HttpStatus code, String message) {
+		SvcLogicContext svcLogic = rc.getSvcLogicContext();
+		String msg = (message == null) ? code.getReasonPhrase() : message;
+		if (msg.contains("\n")) {
+			msg = msg.substring(msg.indexOf("\n"));
+		}
+
+		String status;
+		try {
+			status = Integer.toString(code.getStatusCode());
+		} catch (Exception e) {
+			status = "500";
+		}
+		svcLogic.setStatus(OUTCOME_FAILURE);
+		svcLogic.setAttribute("healthcheck.result.code", "200");
+		svcLogic.setAttribute("healthcheck.result.message", status+" "+msg);
+	}
+
+
+	/**
+	 * @param rc
+	 *            The request context that manages the state and recovery of the
+	 *            request for the life of its processing.
+	 */
+	@SuppressWarnings("static-method")
+	private void doHealthCheckFailure(RequestContext rc, int code, String message) {
+		SvcLogicContext svcLogic = rc.getSvcLogicContext();
+		String msg = Integer.toString(code)+" "+message;
+		svcLogic.setAttribute("healthcheck.result.code", "200");
+		svcLogic.setAttribute("healthcheck.result.message", msg);
+
+	}
+
+
+	@SuppressWarnings("static-method")
+	private void doSuccess(RequestContext rc, int code, String message) {
+		SvcLogicContext svcLogic = rc.getSvcLogicContext();
+		String msg = Integer.toString(code)+" "+message;
+		svcLogic.setAttribute("healthcheck.result.code", "400");
+		svcLogic.setAttribute("healthcheck.result.message", msg);
+
+	}
+
+
+	/**
+	 * initialize the provider adapter by building the context cache
+	 */
+	private void initialize() {
+
+
+		logger.info("init rest health check adapter!!!!!");
+	}
+
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/resources/org/openecomp/appc/default.properties b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/resources/org/openecomp/appc/default.properties
new file mode 100644
index 0000000..d7d9e5c
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/main/resources/org/openecomp/appc/default.properties
@@ -0,0 +1,76 @@
+###
+# ============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=========================================================
+###
+
+#
+# Default properties for the APP-C Provider Adapter
+#
+# -------------------------------------------------------------------------------------------------
+#
+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 
+# to supply configuration options 
+org.openecomp.appc.bootstrap.file=appc.properties
+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
+
+appc.application.name=APPC
+
+#
+# Define the message resource bundle name to be loaded 
+org.openecomp.appc.resources=org/openecomp/appc/i18n/MessageResources
+#
+# The name of the adapter.
+org.openecomp.appc.provider.adaptor.name=org.openecomp.appc.appc_provider_adapter
+#
+# Set up the logging environment
+#
+org.openecomp.appc.logging.file=org/openecomp/appc/logback.xml
+org.openecomp.appc.logging.path=${user.home};etc;../etc
+org.openecomp.appc.logger=org.openecomp.appc
+org.openecomp.appc.security.logger=org.openecomp.appc.security
+#
+# The minimum and maximum provider/tenant context pool sizes.  Min=1 means that as soon 
+# as the provider/tenant is referenced a Context is opened and added to the pool.  Max=0 
+# means that the upper bound on the pool is unbounded. 
+org.openecomp.appc.provider.min.pool=1
+org.openecomp.appc.provider.max.pool=0
+
+#
+# The following properties are used to configure the retry logic for connection to the 
+# IaaS provider(s).  The retry delay property is the amount of time, in seconds, the
+# application waits between retry attempts.  The retry limit is the number of retries
+# that are allowed before the request is failed.
+org.openecomp.appc.provider.retry.delay = 30
+org.openecomp.appc.provider.retry.limit = 10
+
+#
+# The trusted hosts list for SSL access when a certificate is not provided.
+#
+provider.trusted.hosts=*
+#
+# The amount of time, in seconds, to wait for a server state change (start->stop, stop->start, etc).
+# If the server does not change state to a valid state within the alloted time, the operation 
+# fails.
+org.openecomp.appc.server.state.change.timeout=300
+#
+# The amount of time to wait, in seconds, between subsequent polls to the OpenStack provider 
+# to refresh the status of a resource we are waiting on.
+#
+org.openecomp.appc.openstack.poll.interval=20
+#
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/ExecutorHarness.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/ExecutorHarness.java
new file mode 100644
index 0000000..c21435d
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/ExecutorHarness.java
@@ -0,0 +1,180 @@
+/*-
+ * ============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.test;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.openecomp.appc.test.InterceptLogger;
+
+import org.openecomp.sdnc.sli.SvcLogicContext;
+import org.openecomp.sdnc.sli.SvcLogicJavaPlugin;
+
+/**
+ * This class is used as a test harness to wrap the call to an executor node.
+ */
+
+public class ExecutorHarness {
+
+    /**
+     * The executor to be tested
+     */
+    private SvcLogicJavaPlugin executor;
+
+    /**
+     * The collection of all exec methods found on the class
+     */
+    private Map<String, Method> methods;
+
+    /**
+     * The field of the class being tested that contains the reference to the logger to be used. This is modified to
+     * point to our interception logger for the test.
+     */
+    private Field contextLogger;
+
+    /**
+     * The interception logger that buffers all messages logged and allows us to look at them as part of the test case.
+     */
+    private InterceptLogger logger;
+
+    /**
+     * Create the harness and initialize it
+     * 
+     * @throws SecurityException
+     *             If a security manager, s, is present and any of the following conditions is met:
+     *             <ul>
+     *             <li>invocation of s.checkMemberAccess(this, Member.DECLARED) denies access to the declared field</li>
+     *             <li>the caller's class loader is not the same as or an ancestor of the class loader for the current
+     *             class and invocation of s.checkPackageAccess() denies access to the package of this class</li>
+     *             </ul>
+     * @throws NoSuchFieldException
+     *             if a field with the specified name is not found.
+     * @throws IllegalAccessException
+     *             if this Field object is enforcing Java language access control and the underlying field is either
+     *             inaccessible or final.
+     * @throws IllegalArgumentException
+     *             if the specified object is not an instance of the class or interface declaring the underlying field
+     *             (or a subclass or implementor thereof), or if an unwrapping conversion fails.
+     */
+    @SuppressWarnings("nls")
+    public ExecutorHarness() throws NoSuchFieldException, SecurityException, IllegalArgumentException,
+                    IllegalAccessException {
+        methods = new HashMap<>();
+        new SvcLogicContext();
+
+        Class<?> contextClass = SvcLogicContext.class;
+        contextLogger = contextClass.getDeclaredField("LOG");
+        contextLogger.setAccessible(true);
+        logger = new InterceptLogger();
+        contextLogger.set(null, logger);
+    }
+
+    /**
+     * Convenience constructor
+     * 
+     * @param executor
+     *            The executor to be tested by the harness
+     * @throws SecurityException
+     *             If a security manager, s, is present and any of the following conditions is met:
+     *             <ul>
+     *             <li>invocation of s.checkMemberAccess(this, Member.DECLARED) denies access to the declared field</li>
+     *             <li>the caller's class loader is not the same as or an ancestor of the class loader for the current
+     *             class and invocation of s.checkPackageAccess() denies access to the package of this class</li>
+     *             </ul>
+     * @throws NoSuchFieldException
+     *             if a field with the specified name is not found.
+     * @throws IllegalAccessException
+     *             if this Field object is enforcing Java language access control and the underlying field is either
+     *             inaccessible or final.
+     * @throws IllegalArgumentException
+     *             if the specified object is not an instance of the class or interface declaring the underlying field
+     *             (or a subclass or implementor thereof), or if an unwrapping conversion fails.
+     */
+    public ExecutorHarness(SvcLogicJavaPlugin executor) throws NoSuchFieldException, SecurityException,
+                    IllegalArgumentException, IllegalAccessException {
+        this();
+        setExecutor(executor);
+    }
+
+    /**
+     * @param executor
+     *            The java plugin class to be executed
+     */
+    public void setExecutor(SvcLogicJavaPlugin executor) {
+        this.executor = executor;
+        scanExecutor();
+    }
+
+    /**
+     * @return The java plugin class to be executed
+     */
+    public SvcLogicJavaPlugin getExecutor() {
+        return executor;
+    }
+
+    /**
+     * @return The set of all methods that meet the signature requirements
+     */
+    public List<String> getExecMethodNames() {
+        List<String> names = new ArrayList<>();
+        names.addAll(methods.keySet());
+        return names;
+    }
+
+    /**
+     * Returns an indication if the named method is a valid executor method that could be called from a DG execute node
+     * 
+     * @param methodName
+     *            The method name to be validated
+     * @return True if the method name meets the signature requirements, false if the method either does not exist or
+     *         does not meet the requirements.
+     */
+    public boolean isExecMethod(String methodName) {
+        return methods.containsKey(methodName);
+    }
+
+    /**
+     * This method scans the executor class hierarchy to locate all methods that match the required signature of the
+     * executor and records these methods in a map.
+     */
+    private void scanExecutor() {
+        methods.clear();
+        Class<?> executorClass = executor.getClass();
+        Method[] publicMethods = executorClass.getMethods();
+        for (Method method : publicMethods) {
+            if (method.getReturnType().equals(Void.class)) {
+                Class<?>[] paramTypes = method.getParameterTypes();
+                if (paramTypes.length == 2) {
+                    if (Map.class.isAssignableFrom(paramTypes[0])
+                        && SvcLogicContext.class.isAssignableFrom(paramTypes[1])) {
+                        methods.put(method.getName(), method);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/InterceptLogger.java b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/InterceptLogger.java
new file mode 100644
index 0000000..acb1229
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/java/org/openecomp/appc/test/InterceptLogger.java
@@ -0,0 +1,452 @@
+/*-
+ * ============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.test;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Marker;
+
+import ch.qos.logback.classic.Level;
+
+/**
+ * This class is used as an intercept logger that can be used in testing to intercept and record all messages that are
+ * logged, thus allowing a junit test case to examine the log output and make assertions.
+ */
+public class InterceptLogger implements org.slf4j.Logger {
+
+    /**
+     * This inner class represents an intercepted log event.
+     */
+    public class LogRecord {
+        private Level level;
+        private String message;
+        private long timestamp;
+        private Throwable t;
+
+        public LogRecord(Level level, String message) {
+            setLevel(level);
+            setTimestamp(System.currentTimeMillis());
+            setMessage(message);
+        }
+
+        public LogRecord(Level level, String message, Throwable t) {
+            this(level, message);
+            setThrowable(t);
+        }
+
+        /**
+         * @return the value of level
+         */
+        public Level getLevel() {
+            return level;
+        }
+
+        /**
+         * @return the value of message
+         */
+        public String getMessage() {
+            return message;
+        }
+
+        /**
+         * @return the value of timestamp
+         */
+        public long getTimestamp() {
+            return timestamp;
+        }
+
+        /**
+         * @param level
+         *            the value for level
+         */
+        public void setLevel(Level level) {
+            this.level = level;
+        }
+
+        /**
+         * @param message
+         *            the value for message
+         */
+        public void setMessage(String message) {
+            this.message = message;
+        }
+
+        /**
+         * @param timestamp
+         *            the value for timestamp
+         */
+        public void setTimestamp(long timestamp) {
+            this.timestamp = timestamp;
+        }
+
+        /**
+         * @return the value of t
+         */
+        public Throwable getThrowable() {
+            return t;
+        }
+
+        /**
+         * @param t
+         *            the value for t
+         */
+        public void setThrowable(Throwable t) {
+            this.t = t;
+        }
+
+    }
+
+    /**
+     * The list of all intercepted log events
+     */
+    private List<LogRecord> events;
+
+    /**
+     * Create the intercept logger
+     */
+    public InterceptLogger() {
+        events = new ArrayList<LogRecord>(1000);
+    }
+
+    /**
+     * @return Returns all intercepted log events
+     */
+    public List<LogRecord> getLogRecords() {
+        return events;
+    }
+
+    /**
+     * Clears all log events
+     */
+    public void clear() {
+        events.clear();
+    }
+
+    @Override
+    public void debug(Marker marker, String msg) {
+        debug(msg);
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object arg) {
+        debug(MessageFormat.format(format, arg));
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object... arguments) {
+        debug(MessageFormat.format(format, arguments));
+    }
+
+    @Override
+    public void debug(Marker marker, String format, Object arg1, Object arg2) {
+        debug(MessageFormat.format(format, arg1, arg2));
+    }
+
+    @Override
+    public void debug(Marker marker, String msg, Throwable t) {
+        debug(msg, t);
+    }
+
+    @Override
+    public void debug(String msg) {
+        events.add(new LogRecord(Level.DEBUG, msg));
+    }
+
+    @Override
+    public void debug(String format, Object arg) {
+        events.add(new LogRecord(Level.DEBUG, MessageFormat.format(format, arg)));
+    }
+
+    @Override
+    public void debug(String format, Object... arguments) {
+        events.add(new LogRecord(Level.DEBUG, MessageFormat.format(format, arguments)));
+    }
+
+    @Override
+    public void debug(String format, Object arg1, Object arg2) {
+        events.add(new LogRecord(Level.DEBUG, MessageFormat.format(format, arg1, arg2)));
+    }
+
+    @Override
+    public void debug(String msg, Throwable t) {
+        events.add(new LogRecord(Level.DEBUG, msg, t));
+    }
+
+    @Override
+    public void error(Marker marker, String msg) {
+        error(msg);
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object arg) {
+        error(format, arg);
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object... arguments) {
+        error(format, arguments);
+    }
+
+    @Override
+    public void error(Marker marker, String format, Object arg1, Object arg2) {
+        error(format, arg1, arg2);
+    }
+
+    @Override
+    public void error(Marker marker, String msg, Throwable t) {
+        events.add(new LogRecord(Level.ERROR, msg, t));
+    }
+
+    @Override
+    public void error(String msg) {
+        events.add(new LogRecord(Level.ERROR, msg));
+    }
+
+    @Override
+    public void error(String format, Object arg) {
+        events.add(new LogRecord(Level.ERROR, MessageFormat.format(format, arg)));
+    }
+
+    @Override
+    public void error(String format, Object... arguments) {
+        events.add(new LogRecord(Level.ERROR, MessageFormat.format(format, arguments)));
+    }
+
+    @Override
+    public void error(String format, Object arg1, Object arg2) {
+        events.add(new LogRecord(Level.ERROR, MessageFormat.format(format, arg1, arg2)));
+    }
+
+    @Override
+    public void error(String msg, Throwable t) {
+        events.add(new LogRecord(Level.ERROR, msg, t));
+    }
+
+    @Override
+    public String getName() {
+        return null;
+    }
+
+    @Override
+    public void info(Marker marker, String msg) {
+        info(msg);
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object arg) {
+        info(format, arg);
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object... arguments) {
+        info(format, arguments);
+    }
+
+    @Override
+    public void info(Marker marker, String format, Object arg1, Object arg2) {
+        info(format, arg1, arg2);
+    }
+
+    @Override
+    public void info(Marker marker, String msg, Throwable t) {
+        events.add(new LogRecord(Level.INFO, msg, t));
+    }
+
+    @Override
+    public void info(String msg) {
+        events.add(new LogRecord(Level.INFO, msg));
+    }
+
+    @Override
+    public void info(String format, Object arg) {
+        events.add(new LogRecord(Level.INFO, MessageFormat.format(format, arg)));
+    }
+
+    @Override
+    public void info(String format, Object... arguments) {
+        events.add(new LogRecord(Level.INFO, MessageFormat.format(format, arguments)));
+    }
+
+    @Override
+    public void info(String format, Object arg1, Object arg2) {
+        events.add(new LogRecord(Level.INFO, MessageFormat.format(format, arg1, arg2)));
+    }
+
+    @Override
+    public void info(String msg, Throwable t) {
+        events.add(new LogRecord(Level.INFO, msg, t));
+    }
+
+    @Override
+    public boolean isDebugEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isDebugEnabled(Marker marker) {
+        return true;
+    }
+
+    @Override
+    public boolean isErrorEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isErrorEnabled(Marker marker) {
+        return true;
+    }
+
+    @Override
+    public boolean isInfoEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isInfoEnabled(Marker marker) {
+        return true;
+    }
+
+    @Override
+    public boolean isTraceEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isTraceEnabled(Marker marker) {
+        return true;
+    }
+
+    @Override
+    public boolean isWarnEnabled() {
+        return true;
+    }
+
+    @Override
+    public boolean isWarnEnabled(Marker marker) {
+        return true;
+    }
+
+    @Override
+    public void trace(Marker marker, String msg) {
+        trace(msg);
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object arg) {
+        trace(format, arg);
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object... argArray) {
+        trace(format, argArray);
+    }
+
+    @Override
+    public void trace(Marker marker, String format, Object arg1, Object arg2) {
+        trace(format, arg1, arg2);
+    }
+
+    @Override
+    public void trace(Marker marker, String msg, Throwable t) {
+        trace(msg, t);
+    }
+
+    @Override
+    public void trace(String msg) {
+        events.add(new LogRecord(Level.TRACE, msg));
+    }
+
+    @Override
+    public void trace(String format, Object arg) {
+        events.add(new LogRecord(Level.TRACE, MessageFormat.format(format, arg)));
+    }
+
+    @Override
+    public void trace(String format, Object... arguments) {
+        events.add(new LogRecord(Level.TRACE, MessageFormat.format(format, arguments)));
+    }
+
+    @Override
+    public void trace(String format, Object arg1, Object arg2) {
+        events.add(new LogRecord(Level.TRACE, MessageFormat.format(format, arg1, arg2)));
+    }
+
+    @Override
+    public void trace(String msg, Throwable t) {
+        events.add(new LogRecord(Level.TRACE, msg, t));
+    }
+
+    @Override
+    public void warn(Marker marker, String msg) {
+        warn(msg);
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object arg) {
+        warn(format, arg);
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object... arguments) {
+        warn(format, arguments);
+    }
+
+    @Override
+    public void warn(Marker marker, String format, Object arg1, Object arg2) {
+        warn(format, arg1, arg2);
+    }
+
+    @Override
+    public void warn(Marker marker, String msg, Throwable t) {
+        events.add(new LogRecord(Level.WARN, msg, t));
+    }
+
+    @Override
+    public void warn(String msg) {
+        events.add(new LogRecord(Level.WARN, msg));
+    }
+
+    @Override
+    public void warn(String format, Object arg) {
+        events.add(new LogRecord(Level.WARN, MessageFormat.format(format, arg)));
+    }
+
+    @Override
+    public void warn(String format, Object... arguments) {
+        events.add(new LogRecord(Level.WARN, MessageFormat.format(format, arguments)));
+    }
+
+    @Override
+    public void warn(String format, Object arg1, Object arg2) {
+        events.add(new LogRecord(Level.WARN, MessageFormat.format(format, arg1, arg2)));
+    }
+
+    @Override
+    public void warn(String msg, Throwable t) {
+        events.add(new LogRecord(Level.WARN, msg, t));
+    }
+}
diff --git a/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/resources/org/openecomp/appc/default.properties b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/resources/org/openecomp/appc/default.properties
new file mode 100644
index 0000000..0c56e33
--- /dev/null
+++ b/appc-adapters/appc-rest-healthcheck-adapter/appc-rest-healthcheck-adapter-bundle/src/test/resources/org/openecomp/appc/default.properties
@@ -0,0 +1,95 @@
+###
+# ============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=========================================================
+###
+
+#
+# Default properties for the APP-C Provider Adapter
+#
+# -------------------------------------------------------------------------------------------------
+#
+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded
+# to supply configuration options
+org.openecomp.appc.bootstrap.file=appc.properties
+org.openecomp.appc.bootstrap.path=/opt/openecomp/appc/data/properties,${user.home},.
+
+appc.application.name=APPC
+
+#
+# Define the message resource bundle name to be loaded
+org.openecomp.appc.resources=/opt/openecomp/appc/i18n/MessageResources
+#
+# The name of the adapter.
+org.openecomp.appc.provider.adaptor.name=org.openecomp.appc.appc_provider_adapter
+#
+# Set up the logging environment
+#
+org.openecomp.appc.logging.file=/opt/openecomp/appc/logback.xml
+org.openecomp.appc.logging.path=${user.home};etc;../etc
+org.openecomp.appc.logger=org.openecomp.appc
+org.openecomp.appc.security.logger=org.openecomp.appc.security
+#
+# The minimum and maximum provider/tenant context pool sizes.  Min=1 means that as soon
+# as the provider/tenant is referenced a Context is opened and added to the pool.  Max=0
+# means that the upper bound on the pool is unbounded.
+org.openecomp.appc.provider.min.pool=1
+org.openecomp.appc.provider.max.pool=0
+
+#
+# The following properties are used to configure the retry logic for connection to the
+# IaaS provider(s).  The retry delay property is the amount of time, in seconds, the
+# application waits between retry attempts.  The retry limit is the number of retries
+# that are allowed before the request is failed.
+org.openecomp.appc.provider.retry.delay = 30
+org.openecomp.appc.provider.retry.limit = 10
+
+#
+# The trusted hosts list for SSL access when a certificate is not provided.
+#
+provider.trusted.hosts=*
+#
+# The amount of time, in seconds, to wait for a server state change (start->stop, stop->start, etc).
+# If the server does not change state to a valid state within the alloted time, the operation
+# fails.
+org.openecomp.appc.server.state.change.timeout=300
+#
+# The amount of time to wait, in seconds, between subsequent polls to the OpenStack provider
+# to refresh the status of a resource we are waiting on.
+#
+org.openecomp.appc.openstack.poll.interval=20
+#
+# The connection information to connect to the provider we are using.  These properties
+# are "structured" properties, in that the name is a compound name, where the nodes
+# of the name can be ordered (1, 2, 3, ...).  All of the properties with the same ordinal
+# position are defining the same entity.  For example, provider1.type and provider1.name
+# are defining the same provider, whereas provider2.name and provider2.type are defining
+# the values for a different provider.  Any number of providers can be defined in this
+# way.
+#
+
+
+
+provider1.identity=http://localhost:4000/v2.0
+provider1.tenant1.name=Provider1
+provider1.tenant1.userid=test
+provider1.tenant1.password=test
+
+# After a change to the provider make sure to recheck these values with an api call to proivider1.identity/tokens
+test.expected-regions=1
+test.expected-endpoints=1