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
