From: Singal, Kapil (ks220y) 
Date: Tue, 4 May 2021 16:22:25 +0000 (-0400)
Subject: Moving Rest Adaptor from APPC to CCSDK
X-Git-Tag: 1.3.0~21
X-Git-Url: https://gerrit.onap.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F78%2F121078%2F1;p=ccsdk%2Fsli.git
Moving Rest Adaptor from APPC to CCSDK
Issue-ID: CCSDK-3198
Signed-off-by: Singal, Kapil (ks220y) 
Change-Id: I70868423761ce9b8bf04fba2a46913d6e153a30b
---
diff --git a/adaptors/chef-adaptor/chef-adaptor-bundle/pom.xml b/adaptors/chef-adaptor/chef-adaptor-bundle/pom.xml
index 6b1b2a1d9..2a0e217a5 100644
--- a/adaptors/chef-adaptor/chef-adaptor-bundle/pom.xml
+++ b/adaptors/chef-adaptor/chef-adaptor-bundle/pom.xml
@@ -21,7 +21,7 @@
 
   ============LICENSE_END=========================================================
   -->
-
+
     4.0.0
 
     
diff --git a/adaptors/chef-adaptor/chef-adaptor-installer/pom.xml b/adaptors/chef-adaptor/chef-adaptor-installer/pom.xml
index 3d984a960..f15c6cc09 100644
--- a/adaptors/chef-adaptor/chef-adaptor-installer/pom.xml
+++ b/adaptors/chef-adaptor/chef-adaptor-installer/pom.xml
@@ -21,7 +21,7 @@
 
   ============LICENSE_END=========================================================
   -->
-
+
     4.0.0
 
     
diff --git a/adaptors/chef-adaptor/pom.xml b/adaptors/chef-adaptor/pom.xml
index 377a0c279..2e2d3be14 100644
--- a/adaptors/chef-adaptor/pom.xml
+++ b/adaptors/chef-adaptor/pom.xml
@@ -21,7 +21,7 @@
 
   ============LICENSE_END=========================================================
   -->
-
+
     4.0.0
 
     
diff --git a/adaptors/features/ccsdk-ansible-adaptor/pom.xml b/adaptors/features/ccsdk-ansible-adaptor/pom.xml
index ebe4bdcf5..afde62eba 100644
--- a/adaptors/features/ccsdk-ansible-adaptor/pom.xml
+++ b/adaptors/features/ccsdk-ansible-adaptor/pom.xml
@@ -38,6 +38,5 @@
                 
             
         
-
     
 
diff --git a/adaptors/features/ccsdk-netconf-adaptor/pom.xml b/adaptors/features/ccsdk-netconf-adaptor/pom.xml
index f6cb86c10..1f366b751 100644
--- a/adaptors/features/ccsdk-netconf-adaptor/pom.xml
+++ b/adaptors/features/ccsdk-netconf-adaptor/pom.xml
@@ -26,9 +26,9 @@
         
             org.onap.ccsdk.sli.core
             ccsdk-dblib
+            ${project.version}
             xml
             features
-            ${project.version}
         
         
             ${project.groupId}
diff --git a/adaptors/features/ccsdk-rest-adaptor/pom.xml b/adaptors/features/ccsdk-rest-adaptor/pom.xml
new file mode 100644
index 000000000..84ebedbf9
--- /dev/null
+++ b/adaptors/features/ccsdk-rest-adaptor/pom.xml
@@ -0,0 +1,39 @@
+
+
+    4.0.0
+
+    
+        org.onap.ccsdk.parent
+        single-feature-parent
+        2.2.0-SNAPSHOT
+        
+    
+
+    org.onap.ccsdk.sli.adaptors
+    ccsdk-rest-adaptor
+    1.3.0-SNAPSHOT
+    feature
+
+    ccsdk-sli-adaptors :: features :: ${project.artifactId}
+
+    
+        
+            org.opendaylight.controller
+            odl-mdsal-broker
+            xml
+            features
+        
+        
+            org.onap.ccsdk.sli.core
+            ccsdk-sli
+            ${project.version}
+            xml
+            features
+        
+        
+            ${project.groupId}
+            rest-adaptor-bundle
+            ${project.version}
+        
+    
+
diff --git a/adaptors/features/ccsdk-ssh-adaptor/pom.xml b/adaptors/features/ccsdk-ssh-adaptor/pom.xml
index 26f36d694..349dc8c9a 100644
--- a/adaptors/features/ccsdk-ssh-adaptor/pom.xml
+++ b/adaptors/features/ccsdk-ssh-adaptor/pom.xml
@@ -54,5 +54,4 @@
             ${project.version}
         
     
-
 
diff --git a/adaptors/features/pom.xml b/adaptors/features/pom.xml
index 0239755c7..4cae6a401 100755
--- a/adaptors/features/pom.xml
+++ b/adaptors/features/pom.xml
@@ -23,6 +23,7 @@
         ccsdk-ansible-adaptor
         ccsdk-chef-adaptor
         ccsdk-netconf-adaptor
+        ccsdk-rest-adaptor
         ccsdk-saltstack-adaptor
         ccsdk-ssh-adaptor
 
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml b/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml
index ec71a4838..f98cada9c 100644
--- a/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml
+++ b/adaptors/netconf-adaptor/netconf-adaptor-bundle/pom.xml
@@ -21,6 +21,7 @@
   -->
 
     4.0.0
+
     
         org.onap.ccsdk.parent
         binding-parent
@@ -202,5 +203,4 @@
             
         
     
-
 
diff --git a/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml b/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml
index 7fdbdbd89..00a65cbe2 100644
--- a/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml
+++ b/adaptors/netconf-adaptor/netconf-adaptor-installer/pom.xml
@@ -21,6 +21,7 @@
   -->
 
     4.0.0
+
     
         org.onap.ccsdk.parent
         odlparent-lite
@@ -137,5 +138,4 @@
             
         
     
-
 
diff --git a/adaptors/netconf-adaptor/pom.xml b/adaptors/netconf-adaptor/pom.xml
index fa5ecaaee..594eabf84 100644
--- a/adaptors/netconf-adaptor/pom.xml
+++ b/adaptors/netconf-adaptor/pom.xml
@@ -36,14 +36,19 @@
 
     ccsdk-sli-adaptors :: ${project.artifactId}
 
+    
+        netconf-adaptor-bundle
+        netconf-adaptor-installer
+    
+
     
         
             
                 org.onap.ccsdk.sli.adaptors
                 ccsdk-netconf-adaptor
-                features
-                xml
                 ${project.version}
+                xml
+                features
             
             
                 org.onap.ccsdk.sli.adaptors
@@ -52,10 +57,4 @@
             
         
     
-
-    
-        netconf-adaptor-bundle
-        netconf-adaptor-installer
-    
-
 
diff --git a/adaptors/pom.xml b/adaptors/pom.xml
index 98600a6cb..d3a8cfd62 100755
--- a/adaptors/pom.xml
+++ b/adaptors/pom.xml
@@ -27,6 +27,7 @@
         ansible-adaptor
         chef-adaptor
         netconf-adaptor
+        rest-adaptor
         saltstack-adaptor
         ssh-adaptor
 
diff --git a/adaptors/rest-adaptor/pom.xml b/adaptors/rest-adaptor/pom.xml
new file mode 100644
index 000000000..0c2fdb79e
--- /dev/null
+++ b/adaptors/rest-adaptor/pom.xml
@@ -0,0 +1,63 @@
+
+
+
+    4.0.0
+
+    
+        org.onap.ccsdk.parent
+        odlparent-lite
+        2.2.0-SNAPSHOT
+        
+    
+
+    org.onap.ccsdk.sli.adaptors
+    rest-adaptor
+    1.3.0-SNAPSHOT
+    pom
+
+    ccsdk-sli-adaptors :: ${project.artifactId}
+    Abstraction to connect to and utilize the services of cloud providers such as OpenStack or VMWare.
+
+    
+        rest-adaptor-bundle
+        rest-adaptor-installer
+    
+
+    
+        
+            
+                org.onap.ccsdk.sli.adaptors
+                ccsdk-rest-adaptor
+                ${project.version}
+                xml
+                features
+            
+
+            
+                org.onap.ccsdk.sli.adaptors
+                rest-adaptor-bundle
+                ${project.version}
+            
+        
+
+    
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/pom.xml b/adaptors/rest-adaptor/rest-adaptor-bundle/pom.xml
new file mode 100644
index 000000000..d43381a0a
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/pom.xml
@@ -0,0 +1,202 @@
+
+
+
+    4.0.0
+
+    
+        org.onap.ccsdk.parent
+        binding-parent
+        2.2.0-SNAPSHOT
+        
+    
+
+    org.onap.ccsdk.sli.adaptors
+    rest-adaptor-bundle
+    1.3.0-SNAPSHOT
+    bundle
+
+    ccsdk-sli-adaptors :: ${project.artifactId}
+
+    
+        1.1.25.8-oss
+    
+
+    
+        
+            
+                org.onap.ccsdk.sli.core
+                sli-core-artifacts
+                ${project.version}
+                pom
+                import
+            
+        
+    
+    
+        
+            com.att.eelf
+            eelf-core
+        
+        
+            commons-codec
+            commons-codec
+        
+        
+            commons-logging
+            commons-logging
+        
+        
+            org.apache.httpcomponents
+            httpcore
+        
+        
+            org.apache.httpcomponents
+            httpclient
+        
+        
+            org.onap.ccsdk.sli.core
+            sli-common
+        
+        
+            org.onap.ccsdk.sli.core
+            sli-provider
+        
+        
+            javax
+            javaee-api
+        
+        
+            org.osgi
+            org.osgi.core
+        
+        
+            org.slf4j
+            slf4j-api
+        
+        
+            org.slf4j
+            jcl-over-slf4j
+        
+        
+            org.json
+            json
+        
+        
+            com.google.guava
+            guava
+        
+        
+            com.att.cdp
+            cdp-pal-common
+            ${cdp.pal.version}
+            compile
+        
+        
+            com.att.cdp
+            cdp-pal-openstack
+            ${cdp.pal.version}
+            compile
+            
+                
+                    com.att.cdp
+                    cdp-pal-common
+                
+            
+        
+        
+            javax.ws.rs
+            javax.ws.rs-api
+        
+        
+            javax.xml.bind
+            jaxb-api
+        
+        
+            javax.xml
+            jaxp-api
+            1.4.2
+        
+        
+            org.mariadb.jdbc
+            mariadb-java-client
+        
+        
+        
+            junit
+            junit
+            test
+        
+        
+            org.hamcrest
+            hamcrest-all
+            1.3
+            test
+        
+        
+            org.glassfish.jersey.core
+            jersey-common
+            test
+        
+
+        
+        
+            org.mockito
+            mockito-core
+            1.10.19
+            test
+        
+        
+            org.powermock
+            powermock-reflect
+            test
+        
+        
+            org.powermock
+            powermock-module-junit4
+            test
+        
+        
+            org.powermock
+            powermock-api-mockito2
+            test
+        
+    
+
+    
+        
+            
+                org.apache.felix
+                maven-bundle-plugin
+                true
+                
+                    
+                        rest-adaptor
+                        org.onap.ccsdk.sli.adaptors.rest
+                        org.onap.ccsdk.sli.core.sli.*,org.osgi.framework.*,org.slf4j.*,com.vmware.*,org.apache.xerces.*,javax.net.*,javax.net.ssl.*,org.xml.sax.*,javax.xml.bind.*,javax.naming.*
+                        *;scope=compile|runtime;artifactId=!sli-common|org.eclipse.osgi|slf4j-api|jcl-over-slf4j|mariadb-java-client|xml-apis|jaxp-api
+                        true
+                    
+                
+            
+        
+    
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/Constants.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/Constants.java
new file mode 100644
index 000000000..4478bd9f1
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/Constants.java
@@ -0,0 +1,228 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Modifications Copyright (C) 2018 Samsung
+ * ================================================================================
+ * 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.onap.ccsdk.sli.adaptors.rest;
+
+/**
+ * This class contains the definitions of all constant values used in the APPC provider, adapters, and other components.
+ * These constants define properties, settings, and context variables. The context variables can be referenced from
+ * within the directed graph(s) to access information placed their by the provider and adapters.
+ * 
+ * Context properties are set in the graph context by the various adapters and the provider, or by the graph itself.
+ * These properties may also be accessed by the graph, adapters, or the provider. It is these properties that allow
+ * communication of state through the directed graph. All context properties have a symbolic name that starts with
+ * "CONTEXT_".
+ * 
+ */
+
+public final class Constants {
+
+    /**
+     * The name for the error code attribute to be set in the context
+     */
+    @SuppressWarnings("nls")
+    public static final String ATTRIBUTE_ERROR_CODE = "error_code";
+
+    /**
+     * The name for the error message attribute to be set in the context
+     */
+    @SuppressWarnings("nls")
+    public static final String ATTRIBUTE_ERROR_MESSAGE = "error-message";
+
+    /**
+     * The name for the error message  to be set in the context
+     */
+    @SuppressWarnings("nls")
+    public static final String CONTEXT_ERROR_MESSAGE = "org.onap.rest.result.message";
+
+    @SuppressWarnings("nls")
+    public static final String CONTEXT_AGENT_ERROR_MESSAGE = "org.onap.rest.agent.result.message";
+
+    /**
+     * The name for the error code  to be set in the context
+     */
+    @SuppressWarnings("nls")
+    public static final String CONTEXT_ERROR_CODE = "org.onap.rest.result.code";
+
+    @SuppressWarnings("nls")
+    public static final String CONTEXT_AGENT_ERROR_CODE = "org.onap.rest.agent.result.code";
+
+    /**
+     * The name for the success message attribute to be set in the context
+     */
+    @SuppressWarnings("nls")
+    public static final String ATTRIBUTE_SUCCESS_MESSAGE = "success-message";
+
+    public static final String DG_ATTRIBUTE_STATUS = "SvcLogic.status";
+    public static final String DG_OUTPUT_STATUS_CODE = "output.status.code";
+    public static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message";
+
+    /**
+     * The property that defines the name of the DG service logic to be loaded
+     */
+    public static final String PROPERTY_MODULE_NAME = "appc.service.logic.module.name";
+
+    /**
+     * The property that defines the topology restart DG version to be used
+     */
+    public static final String PROPERTY_TOPOLOGY_VERSION = "appc.topology.dg.version";
+
+    /**
+     * The method name of the DG that is used to perform topology restart operations
+     */
+    public static final String PROPERTY_TOPOLOGY_METHOD = "appc.topology.dg.method";
+
+    /**
+     * The property that supplies the application name
+     */
+    public static final String PROPERTY_APPLICATION_NAME = "appc.application.name";
+
+    /**
+     * The execution mode for the directed graph
+     */
+    public static final String SYNC_MODE = "sync";
+
+    /**
+     * The name of the property that contains the service request enumerated value in the graph's context
+     */
+    public static final String CONTEXT_SERVICE = "org.onap.appc.service";
+
+    /**
+     * The name of the property that contains the VM id value in the graph's context
+     */
+    public static final String CONTEXT_VMID = "org.onap.appc.vmid";
+
+    /**
+     * The name of the property that contains the VM id value in the graph's context
+     */
+    public static final String CONTEXT_IDENTITY_URL = "org.onap.appc.identity.url";
+
+    /**
+     * The name of the property that contains the service request id value in the graph's context
+     */
+    public static final String CONTEXT_REQID = "org.onap.appc.reqid";
+
+    /**
+     * The name of the property that indicates which method of the IaaS adapter to call
+     */
+    public static final String CONTEXT_ACTION = "org.onap.appc.action";
+
+    /**
+     * The enumerated value for restart of a VM. This is a constant for one possible value of CONTEXT_SERVICE.
+     */
+    public static final String SERVICE_RESTART = "RESTART";
+
+    /**
+     * The enumerated value for rebuild of a VM. This is a constant for one possible value of CONTEXT_SERVICE.
+     */
+    public static final String SERVICE_REBUILD = "REBUILD";
+
+    /**
+     * The name of the adapter. We get the name from a property file so that it can be changed easily if needed.
+     */
+    public static final String PROPERTY_ADAPTER_NAME = "org.onap.appc.provider.adaptor.name";
+
+    /**
+     * The minimum number of contexts to cache in each provider/tenant pool
+     */
+    public static final String PROPERTY_MIN_POOL_SIZE = "org.onap.appc.provider.min.pool";
+
+    /**
+     * The maximum number of contexts to cache in each provider/tenant pool
+     */
+    public static final String PROPERTY_MAX_POOL_SIZE = "org.onap.appc.provider.max.pool";
+
+    /**
+     * The amount of time, in seconds, that the application waits for a change of state of a server to a known valid
+     * state before giving up and failing the request.
+     */
+    public static final String PROPERTY_SERVER_STATE_CHANGE_TIMEOUT = "org.onap.appc.server.state.change.timeout";
+
+    /**
+     * The amount of time, in seconds, between subsequent polls to the openstack provider to update the state of a
+     * resource
+     */
+    public static final String PROPERTY_OPENSTACK_POLL_INTERVAL = "org.onap.appc.openstack.poll.interval";
+
+    /**
+     * The amount of time, in seconds, to wait between retry attempts when a connection to a provider fails.
+     */
+    public static final String PROPERTY_RETRY_DELAY = "org.onap.appc.provider.retry.delay";
+
+    /**
+     * The maximum number of times a connection retry will be attempted before the application fails the request
+     */
+    public static final String PROPERTY_RETRY_LIMIT = "org.onap.appc.provider.retry.limit";
+    /**
+     * The amount of time, in seconds, that the application waits for a change of state of a stacj to a known valid
+     * state before giving up and failing the request.
+     */
+    public static final String PROPERTY_STACK_STATE_CHANGE_TIMEOUT = "org.onap.appc.stack.state.change.timeout";
+
+    @SuppressWarnings("nls")
+    public static final String STATUS_GETTER = "status-getter";
+
+    @SuppressWarnings("nls")
+    public static final String VM_FUSION_STATUS_GETTER = "fusion-vm-status-getter";
+
+    /**
+     * The name for the status vm attribute to be set in the context when executing a vmstatuscheck.
+     */
+    @SuppressWarnings("nls")
+    public static final String STATUS_OF_VM = "status-vm";
+
+    /**
+     * Yang revision value to be used while generating YANG module
+     */
+    public static final String YANG_REVISION = "2017-03-03";
+    /**
+     * Yang revision format to be used while formatting YANG revision date
+     */
+    public static final String YANG_REVISION_FORMAT = "YYYY-MM-DD";
+
+    /**
+     * Base container for  yang that is generated to store in MD-SAL datastore
+     */
+    public static final String YANG_BASE_CONTAINER = "vnf-config-repo";
+
+    /**
+     * VNF config list for yang that is generated to store in MD-SAL datastore
+     */
+    public static final String YANG_VNF_CONFIG_LIST = "vnf-config-list";
+
+    /**
+     * Base container of VNF configuration data for yang that is generated to store in MD-SAL datastore
+     */
+    public static final String YANG_VNF_CONFIG = "vnf-config";
+
+    /**
+     * default constructor prevents instantiation
+     */
+    Constants() {
+        throw new IllegalAccessError("Constants");
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RequestFactory.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RequestFactory.java
new file mode 100644
index 000000000..ba1f7f5d9
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RequestFactory.java
@@ -0,0 +1,60 @@
+/*
+ * ============LICENSE_START=============================================================================================================
+ * Copyright (c) 2017 Intel Corp.  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.onap.ccsdk.sli.adaptors.rest;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Supplier;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.utils.URIBuilder;
+
+public class RequestFactory {
+    static final Map> map = new HashMap<>();
+
+    static {
+        map.put("GET", HttpGet :: new);
+        map.put("POST", HttpPost :: new);
+        map.put("PUT", HttpPut :: new);
+        map.put("DELETE", HttpDelete :: new);
+    }
+
+    private final EELFLogger logger = EELFManager.getInstance().getLogger(RequestFactory.class);
+
+    public HttpRequestBase getHttpRequest(String method, String tUrl) {
+        Supplier httpRequestSupplier = map.get(method.toUpperCase());
+        URI uri = null;
+        if (httpRequestSupplier != null) {
+            try {
+                uri = new URIBuilder(tUrl).build();
+            } catch (URISyntaxException ex) {
+                logger.error("URI Syntax Incorrect: " + tUrl, ex);
+            }
+            HttpRequestBase httpRequest = httpRequestSupplier.get();
+            httpRequest.setURI(uri);
+            return httpRequest;
+
+        }
+        throw new IllegalArgumentException("No method named: " + method.toUpperCase());
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RestAdaptor.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RestAdaptor.java
new file mode 100644
index 000000000..836123698
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/RestAdaptor.java
@@ -0,0 +1,204 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.ccsdk.sli.adaptors.rest;
+
+import java.util.Map;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
+
+/**
+ * This interface defines the operations that the provider adaptor exposes.
+ * 
+ * This interface defines static constant property values that can be used to configure the adaptor. These constants are
+ * prefixed with the name PROPERTY_ to indicate that they are configuration properties. These properties are read from
+ * the configuration file for the adaptor and are used to define the providers, identity service URLs, and other
+ * information needed by the adaptor to interface with an IaaS provider.
+ * 
+ */
+public interface RestAdaptor extends SvcLogicJavaPlugin {
+
+    /**
+     * The type of provider to be accessed to locate and operate on a virtual machine instance. This is used to load the
+     * correct provider support through the CDP IaaS abstraction layer and can be OpenStackProvider, BareMetalProvider,
+     * or any other supported provider type.
+     */
+    static final String PROPERTY_PROVIDER_TYPE = "org.onap.appc.provider.type";
+
+    /**
+     * The adaptor maintains a cache of providers organized by the name of the provider, not its type. This is
+     * equivalent to the system or installation name. All regions within the same installation are assumed to be the
+     * same type.
+     */
+    static final String PROPERTY_PROVIDER_NAME = "org.onap.appc.provider.name";
+
+    /**
+     * The fully-qualified URL of the instance to be manipulated as it is known to the provider.
+     */
+    static final String PROPERTY_INSTANCE_URL = "org.onap.appc.instance.url";
+
+    /**
+     * The fully-qualified URL of the instance to be manipulated as it is known to the provider.
+     */
+    static final String PROPERTY_IDENTITY_URL = "org.onap.appc.identity.url";
+
+    /**
+     * This method is used to restart an existing virtual machine given the fully qualified URL of the machine.
+     * 
+     * This method is invoked from a directed graph as an Executor node. This means that the parameters
+     * passed to the method are passed as properties in a map. This method expects the following properties to be
+     * defined:
+     * 
+     * - org.onap.appc.provider.type+     *
- The appropriate provider type, such as OpenStackProvider. This is used by the CDP IaaS
+     * abstraction layer to dynamically load and open a connection to the appropriate provider type. All CDP supported
+     * provider types are legal.
+     *- org.onap.appc.instance.url+     *
- The fully qualified URL of the instance to be restarted, as it is known to the provider (i.e., the self-link
+     * URL of the server)+     *
+     *
+     *
+     * @param properties
+     *            A map of name-value pairs that supply the parameters needed by this method. The properties needed are
+     *            defined above.
+     * @param context
+     *            The service logic context of the graph being executed.
+     * @return The Server object that represents the VM being restarted. The returned server object can be
+     *         inspected for the final state of the server once the restart has been completed. The method does not
+     *         return until the restart has either completed or has failed.
+     * @throws APPCException
+     *             If the server cannot be restarted for some reason
+     */
+    //  Server restartServer(Map properties, SvcLogicContext context) throws APPCException;
+
+    /**
+     * This method is used to stop the indicated server
+     * 
+     * This method is invoked from a directed graph as an Executor node. This means that the parameters
+     * passed to the method are passed as properties in a map. This method expects the following properties to be
+     * defined:
+     * 
+     * - org.onap.appc.provider.type+     *
- The appropriate provider type, such as OpenStackProvider. This is used by the CDP IaaS
+     * abstraction layer to dynamically load and open a connection to the appropriate provider type. All CDP supported
+     * provider types are legal.
+     *- org.onap.appc.instance.url+     *
- The fully qualified URL of the instance to be stopped, as it is known to the provider (i.e., the self-link
+     * URL of the server)+     *
+     * 
+     *
+     * @param properties
+     *            A map of name-value pairs that supply the parameters needed by this method. The properties needed are
+     *            defined above.
+     * @param context
+     *            The service logic context of the graph being executed.
+     * @return TheServer object that represents the VM being stopped. The returned server object can be
+     *         inspected for the final state of the server once the stop has been completed. The method does not return
+     *         until the stop has either completed or has failed.
+     * @throws APPCException
+     *             If the server cannot be stopped for some reason
+     */
+    //Server stopServer(Map properties, SvcLogicContext context) throws APPCException;
+
+    /**
+     * This method is used to start the indicated server
+     * 
+     * This method is invoked from a directed graph as an Executor node. This means that the parameters
+     * passed to the method are passed as properties in a map. This method expects the following properties to be
+     * defined:
+     * 
+     * - org.onap.appc.provider.type+     *
- The appropriate provider type, such as OpenStackProvider. This is used by the CDP IaaS
+     * abstraction layer to dynamically load and open a connection to the appropriate provider type. All CDP supported
+     * provider types are legal.
+     *- org.onap.appc.instance.url+     *
- The fully qualified URL of the instance to be started, as it is known to the provider (i.e., the self-link
+     * URL of the server)+     *
+     * 
+     *
+     * @param properties
+     *            A map of name-value pairs that supply the parameters needed by this method. The properties needed are
+     *            defined above.
+     * @param context
+     *            The service logic context of the graph being executed.
+     * @return TheServer object that represents the VM being started. The returned server object can be
+     *         inspected for the final state of the server once the start has been completed. The method does not return
+     *         until the start has either completed or has failed.
+     * @throws APPCException
+     *             If the server cannot be started for some reason
+     */
+    // Server startServer(Map properties, SvcLogicContext context) throws APPCException;
+
+    /**
+     * This method is used to rebuild the indicated server
+     * 
+     * This method is invoked from a directed graph as an Executor node. This means that the parameters
+     * passed to the method are passed as properties in a map. This method expects the following properties to be
+     * defined:
+     * 
+     * - org.onap.appc.provider.type+     *
- The appropriate provider type, such as OpenStackProvider. This is used by the CDP IaaS
+     * abstraction layer to dynamically load and open a connection to the appropriate provider type. All CDP supported
+     * provider types are legal.
+     *- org.onap.appc.instance.url+     *
- The fully qualified URL of the instance to be rebuilt, as it is known to the provider (i.e., the self-link
+     * URL of the server)+     *
+     * 
+     *
+     * @param properties
+     *            A map of name-value pairs that supply the parameters needed by this method. The properties needed are
+     *            defined above.
+     * @param context
+     *            The service logic context of the graph being executed.
+     * @return TheServer object that represents the VM being rebuilt. The returned server object can be
+     *         inspected for the final state of the server once the rebuild has been completed. The method does not
+     *         return until the rebuild has either completed or has failed.
+     * @throws APPCException
+     *             If the server cannot be rebuilt for some reason
+     */
+    //   Server rebuildServer(Map properties, SvcLogicContext context) throws APPCException;
+
+    /**
+     * Returns the symbolic name of the adaptor
+     *
+     * @return The adaptor name
+     */
+    String getAdaptorName();
+
+    // Server evacuateServer(Map params, SvcLogicContext ctx) throws APPCException;
+
+    //Server migrateServer(Map params, SvcLogicContext ctx) throws APPCException;
+
+    void commonGet(Map params, SvcLogicContext ctx);
+
+    void commonPost(Map params, SvcLogicContext ctx);
+
+    void commonPut(Map params, SvcLogicContext ctx);
+
+    void commonDelete(Map params, SvcLogicContext ctx);
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContext.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContext.java
new file mode 100644
index 000000000..4f297a23b
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContext.java
@@ -0,0 +1,249 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ============LICENSE_END=========================================================
+ */
+
+
+package org.onap.ccsdk.sli.adaptors.rest.impl;
+
+import org.onap.ccsdk.sli.adaptors.rest.Constants;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.utils.configuration.Configuration;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+
+/**
+ * This class is used to track and maintain recovery and time-to-live information for a request as it is being
+ * processed.
+ */
+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
+     */
+    private Configuration configuration = ConfigurationFactory.getConfiguration();
+
+    /**
+     * 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 = configuration.getIntegerProperty(Constants.PROPERTY_RETRY_DELAY);
+            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 = configuration.getIntegerProperty(Constants.PROPERTY_RETRY_LIMIT);
+            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.
+     * 
+     * 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.
+     * 
+     *
+     * @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/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedException.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedException.java
new file mode 100644
index 000000000..c6253fbbd
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedException.java
@@ -0,0 +1,225 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Modification Copyright (C) 2019 IBM
+ * =============================================================================
+ * 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.onap.ccsdk.sli.adaptors.rest.impl;
+
+import com.att.cdp.zones.model.Server;
+import org.glassfish.grizzly.http.util.HttpStatus;
+
+/**
+ * This class is used to capture the exact cause and point of failure for the processing of a request. It is then used
+ * to encode the reason for the failure, status code, and anything else that needs to be captured and reported for
+ * diagnostic purposes.
+ */
+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 transient 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;
+    }
+
+    /**
+     * @param operation The operation being performed
+     */
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    /**
+     * @return The reason for the failure
+     */
+    public String getReason() {
+        return reason;
+    }
+
+    /**
+     * @param reason The reason for the failure
+     */
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    /**
+     * @return The server being operated upon
+     */
+    public Server getServer() {
+        return server;
+    }
+
+    /**
+     * @param server The server being operated upon
+     */
+    public void setServer(Server server) {
+        this.server = server;
+        if (server != null) {
+            setServerId(server.getId());
+        }
+    }
+
+    /**
+     * @return The id of the server being operated upon
+     */
+    public String getServerId() {
+        return serverId;
+    }
+
+    /**
+     * @param serverId The id of the server being operated upon
+     */
+    public void setServerId(String serverId) {
+        this.serverId = serverId;
+    }
+
+    /**
+     * @return The status code from the operation
+     */
+    public HttpStatus getStatus() {
+        return status;
+    }
+
+    /**
+     * @param status The status of the request
+     */
+    public void setStatus(HttpStatus status) {
+        this.status = status;
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RestAdaptorImpl.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RestAdaptorImpl.java
new file mode 100644
index 000000000..ad06e9584
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/java/org/onap/ccsdk/sli/adaptors/rest/impl/RestAdaptorImpl.java
@@ -0,0 +1,244 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Modifications Copyright (C) 2018 Samsung
+ * ================================================================================
+ * 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.onap.ccsdk.sli.adaptors.rest.impl;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.function.Supplier;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.json.JSONObject;
+import org.onap.ccsdk.sli.adaptors.rest.Constants;
+import org.onap.ccsdk.sli.adaptors.rest.RequestFactory;
+import org.onap.ccsdk.sli.adaptors.rest.RestAdaptor;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.utils.configuration.Configuration;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+
+/**
+ * This class implements the {@link RestAdaptor} interface. This interface defines the behaviors that our service
+ * provides.
+ */
+public class RestAdaptorImpl implements RestAdaptor {
+
+    /**
+     * The constant for the status code for a failed outcome
+     */
+    @SuppressWarnings("nls")
+    private static final String OUTCOME_FAILURE = "failure";
+
+    /**
+     * The constant for the status code for a successful outcome
+     */
+    @SuppressWarnings("nls")
+    private static final String OUTCOME_SUCCESS = "success";
+
+    /**
+     * The logger to be used
+     */
+    private final EELFLogger logger = EELFManager.getInstance().getLogger(RestAdaptorImpl.class);
+
+    /**
+     * A reference to the adaptor configuration object.
+     */
+    private Configuration configuration;
+
+    /**
+     * This default constructor is used as a work around because the activator wasnt getting called
+     */
+    public RestAdaptorImpl() {
+        initialize();
+    }
+
+    /**
+     * Returns the symbolic name of the adaptor
+     *
+     * @return The adaptor name
+     *
+     * @see RestAdaptor#getAdaptorName()
+     */
+    @Override
+    public String getAdaptorName() {
+        return configuration.getProperty(Constants.PROPERTY_ADAPTER_NAME);
+    }
+
+    @Override
+    public void commonGet(Map params, SvcLogicContext ctx) {
+        logger.info("Run get method");
+
+        RequestContext rc = new RequestContext(ctx);
+        rc.isAlive();
+
+        HttpGet httpGet = (HttpGet) createHttpRequest("GET", params, rc);
+        executeHttpRequest(httpGet, rc);
+    }
+
+    @Override
+    public void commonDelete(Map params, SvcLogicContext ctx) {
+        logger.info("Run Delete method");
+
+        RequestContext rc = new RequestContext(ctx);
+        rc.isAlive();
+
+        HttpDelete httpDelete = (HttpDelete) createHttpRequest("DELETE", params, rc);
+        executeHttpRequest(httpDelete, rc);
+    }
+
+    @Override
+    public void commonPost(Map params, SvcLogicContext ctx) {
+        logger.info("Run post method");
+
+        RequestContext rc = new RequestContext(ctx);
+        rc.isAlive();
+
+        HttpPost httpPost = (HttpPost) createHttpRequest("POST", params, rc);
+        executeHttpRequest(httpPost, rc);
+    }
+
+    @Override
+    public void commonPut(Map params, SvcLogicContext ctx) {
+        logger.info("Run put method");
+
+        RequestContext rc = new RequestContext(ctx);
+        rc.isAlive();
+
+        HttpPut httpPut = (HttpPut) createHttpRequest("PUT", params, rc);
+        executeHttpRequest(httpPut, rc);
+    }
+
+    @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) {
+            logger.error("Exception occurred", e);
+            status = "500";
+        }
+        svcLogic.setStatus(OUTCOME_FAILURE);
+        svcLogic.setAttribute(Constants.ATTRIBUTE_ERROR_CODE, status);
+        svcLogic.setAttribute(Constants.ATTRIBUTE_ERROR_MESSAGE, msg);
+        svcLogic.setAttribute(Constants.CONTEXT_ERROR_CODE, status);
+        svcLogic.setAttribute(Constants.CONTEXT_ERROR_MESSAGE, 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 doSuccess(RequestContext rc, int code, String message) {
+        SvcLogicContext svcLogic = rc.getSvcLogicContext();
+        svcLogic.setStatus(OUTCOME_SUCCESS);
+        svcLogic.setAttribute(Constants.ATTRIBUTE_ERROR_CODE, Integer.toString(HttpStatus.OK_200.getStatusCode()));
+        svcLogic.setAttribute(Constants.ATTRIBUTE_ERROR_MESSAGE, message);
+        svcLogic.setAttribute(Constants.CONTEXT_AGENT_ERROR_CODE, Integer.toString(code));
+        svcLogic.setAttribute(Constants.CONTEXT_AGENT_ERROR_MESSAGE, message);
+        svcLogic.setAttribute(Constants.CONTEXT_ERROR_CODE, Integer.toString(HttpStatus.OK_200.getStatusCode()));
+    }
+
+    private void executeHttpRequest(HttpRequestBase httpRequest, RequestContext rc) {
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            HttpResponse response = httpClient.execute(httpRequest);
+            int responseCode = response.getStatusLine().getStatusCode();
+            HttpEntity entity = response.getEntity();
+            String responseOutput = EntityUtils.toString(entity);
+            if (responseCode == 200) {
+                doSuccess(rc, responseCode, responseOutput);
+            } else {
+                doFailure(rc, HttpStatus.getHttpStatus(responseCode), response.getStatusLine().getReasonPhrase());
+            }
+        } catch (Exception e) {
+            logger.error("An error occurred when executing http request", e);
+            doFailure(rc, HttpStatus.INTERNAL_SERVER_ERROR_500, e.toString());
+        }
+    }
+
+    public HttpRequestBase createHttpRequest(String method, Map params, RequestContext rc) {
+        HttpRequestBase httpRequest = null;
+        try {
+            String tUrl = params.get("org.onap.appc.instance.URI");
+            String haveHeader = params.get("org.onap.appc.instance.haveHeader");
+            String headers = params.get("org.onap.appc.instance.headers");
+
+            Supplier requestFactory = RequestFactory :: new;
+            httpRequest = requestFactory.get().getHttpRequest(method, tUrl);
+
+            if ("true".equals(haveHeader)) {
+                JSONObject jsonHeaders = new JSONObject(headers);
+                Iterator keys = jsonHeaders.keys();
+                while (keys.hasNext()) {
+                    String string1 = (String) keys.next();
+                    String string2 = jsonHeaders.getString(string1);
+                    httpRequest.addHeader(string1, string2);
+                }
+            }
+            if (params.containsKey("org.onap.appc.instance.requestBody")) {
+                String body = params.get("org.onap.appc.instance.requestBody");
+                StringEntity bodyParams = new StringEntity(body, "UTF-8");
+                if ("PUT".equals(method)) {
+                    HttpPut httpPut = (HttpPut) httpRequest;
+                    httpPut.setEntity(bodyParams);
+                }
+                if ("POST".equals(method)) {
+                    HttpPost httpPost = (HttpPost) httpRequest;
+                    httpPost.setEntity(bodyParams);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("An error occurred when creating http request", e);
+            doFailure(rc, HttpStatus.INTERNAL_SERVER_ERROR_500, e.toString());
+        }
+        return httpRequest;
+    }
+
+    /**
+     * initialize the provider adaptor by building the context cache
+     */
+    private void initialize() {
+        configuration = ConfigurationFactory.getConfiguration();
+
+        logger.info("Rest adaptor has been initialized");
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/resources/rest-adaptor.properties b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/resources/rest-adaptor.properties
new file mode 100644
index 000000000..a695c63c1
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/main/resources/rest-adaptor.properties
@@ -0,0 +1,95 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# ============LICENSE_END=========================================================
+###
+
+#
+# Default properties for the APP-C Provider Adaptor
+#
+# -------------------------------------------------------------------------------------------------
+#
+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 
+# to supply configuration options 
+org.onap.appc.bootstrap.file=appc.properties
+org.onap.appc.bootstrap.path=/opt/onap/appc/data/properties,${user.home},.
+
+appc.application.name=APPC
+
+#
+# Define the message resource bundle name to be loaded 
+org.onap.appc.resources=org/onap/appc/i18n/MessageResources
+#
+# The name of the adaptor.
+org.onap.appc.provider.adaptor.name=org.onap.appc.appc_provider_adaptor
+#
+# Set up the logging environment
+#
+org.onap.appc.logging.file=org/onap/appc/logback.xml
+org.onap.appc.logging.path=${user.home};etc;../etc
+org.onap.appc.logger=org.onap.appc
+org.onap.appc.security.logger=org.onap.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.onap.appc.provider.min.pool=1
+org.onap.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.onap.appc.provider.retry.delay = 30
+org.onap.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.onap.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.onap.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. 
+#
+# Don't change these 2 right now since they are hard coded in the DG
+#provider1.type=appc
+#provider1.name=appc
+
+#These you can change
+#provider1.identity=appc
+#provider1.tenant1.name=appc
+#provider1.tenant1.userid=appc
+#provider1.tenant1.password=appc
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContextTest.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContextTest.java
new file mode 100644
index 000000000..ba06efd61
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestContextTest.java
@@ -0,0 +1,180 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2018 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.onap.ccsdk.sli.adaptors.rest.impl;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.sli.adaptors.rest.Constants;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.utils.configuration.Configuration;
+import org.onap.ccsdk.sli.core.utils.configuration.ConfigurationFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test the RequestContext object
+ * 
+ * The request context is used to track retries, recovery attempts, and time to live of the
+ * processing of a request.
+ * 
+ */
+
+public class RequestContextTest {
+
+    private RequestContext rc;
+    private Configuration config = ConfigurationFactory.getConfiguration();
+
+    /**
+     * Set up the test environment by forcing the retry delay and limit to small values for the test
+     * and setting up the request context object.
+     */
+    @Before
+    public void setup() {
+        config.setProperty(Constants.PROPERTY_RETRY_DELAY, "1");
+        config.setProperty(Constants.PROPERTY_RETRY_LIMIT, "3");
+        rc = new RequestContext(null);
+        rc.setTimeToLiveSeconds(2);
+    }
+
+    /**
+     * Ensure that we set up the property correctly
+     */
+    @Test
+    public void testRetryDelayProperty() {
+        assertEquals(1, rc.getRetryDelay());
+    }
+
+    /**
+     * Ensure that we set up the property correctly
+     */
+    @Test
+    public void testRetryLimitProperty() {
+        assertEquals(3, rc.getRetryLimit());
+    }
+
+    /**
+     * This test ensures that the retry attempt counter is zero on a new context
+     */
+    @Test
+    public void testRetryCountNoRetries() {
+        assertEquals(0, rc.getAttempts());
+    }
+
+    /**
+     * Test that the delay is accurate
+     */
+    @Test
+    public void testDelay() {
+        long future = System.currentTimeMillis() + (rc.getRetryDelay() * 1000L);
+
+        rc.delay();
+
+        assertTrue(System.currentTimeMillis() >= future);
+    }
+
+    /**
+     * The RequestContext tracks the number of retry attempts against the limit.
+     * This unannotated test verifies that the maximum number of retries can be attempted.
+     * With argument testPastLimit set to true, it demonstrates going beyond the limit fails.
+     */
+    private void internalTestCanRetry(boolean testPastLimit) {
+        assertEquals(0, rc.getAttempts());
+        assertTrue(rc.attempt());
+        assertFalse(rc.isFailed());
+        assertEquals(1, rc.getAttempts());
+        assertTrue(rc.attempt());
+        assertFalse(rc.isFailed());
+        assertEquals(2, rc.getAttempts());
+        assertTrue(rc.attempt());
+        assertFalse(rc.isFailed());
+        assertEquals(3, rc.getAttempts());
+        if (testPastLimit) {
+            assertFalse(rc.attempt());
+            assertTrue(rc.isFailed());
+            assertEquals(3, rc.getAttempts());
+            assertFalse(rc.attempt());
+            assertTrue(rc.isFailed());
+            assertEquals(3, rc.getAttempts());
+        }
+    }
+
+    /**
+     * The RequestContext tracks the number of retry attempts against the limit. This test verifies
+     * that tracking logic works correctly.
+     */
+    @Test
+    public void testCanRetry() {
+        internalTestCanRetry(true);
+    }
+
+    /**
+     * The same RequestContext is used throughout the processing, and retries need to be reset once
+     * successfully connected so that any earlier (successful) recoveries are not considered when
+     * performing any new future recoveries. This test ensures that a reset clears the retry counter
+     * and that we can attempt retries again up to the limit.
+     */
+    @Test
+    public void testResetAndCanRetry() {
+        internalTestCanRetry(false);
+        rc.reset();
+        internalTestCanRetry(true);
+    }
+
+    /**
+     * This test is used to test tracking of time to live for the request context. Because time is
+     * inexact, the assertions can only be ranges of values, such as at least some value or greater.
+     * The total duration tracking in the request context is only updated on each call to
+     * {@link RequestContext#isAlive()}. Also, durations are NOT affected by calls to reset.
+     */
+    @Test
+    public void testTimeToLive() {
+        assertTrue(rc.getTotalDuration() == 0L);
+        assertTrue(rc.isAlive());
+        rc.reset();
+        rc.delay();
+        assertTrue(rc.isAlive());
+        assertTrue(rc.getTotalDuration() >= 1000L);
+        rc.reset();
+        rc.delay();
+        rc.isAlive();
+        assertTrue(rc.getTotalDuration() >= 2000L);
+        rc.reset();
+        rc.delay();
+        assertFalse(rc.isAlive());
+        assertTrue(rc.getTotalDuration() >= 3000L);
+    }
+
+    /**
+     * Demonstrate setSvcLogicContext/getSvcLogicContext work as expected
+     */
+    @Test
+    public void testGetSvcLogicContext() {
+        assertNull(rc.getSvcLogicContext());
+        SvcLogicContext slc = new SvcLogicContext();
+        rc.setSvcLogicContext(slc);
+        assertEquals(slc, rc.getSvcLogicContext());
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedExceptionTest.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedExceptionTest.java
new file mode 100644
index 000000000..9455d3b64
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/RequestFailedExceptionTest.java
@@ -0,0 +1,138 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright 2018 TechMahindra
+ *=================================================================================
+ * Modifications Copyright 2019 IBM.
+ *=================================================================================
+ * 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.onap.ccsdk.sli.adaptors.rest.impl;
+
+import com.att.cdp.zones.model.Server;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class RequestFailedExceptionTest {
+
+    @Test
+    public void testConstructorNoArgument() throws Exception {
+        RequestFailedException requestFailedException = new RequestFailedException();
+        Assert.assertTrue(requestFailedException.getCause() == null);
+        Assert.assertTrue(requestFailedException.getLocalizedMessage() == null);
+        Assert.assertTrue(requestFailedException.getMessage() == null);
+    }
+
+    @Test
+    public void testConstructorWithMessage() throws Exception {
+        String message = "testing message";
+        RequestFailedException requestFailedException = new RequestFailedException(message);
+        Assert.assertTrue(requestFailedException.getCause() == null);
+        Assert.assertEquals(message, requestFailedException.getLocalizedMessage());
+        Assert.assertEquals(message, requestFailedException.getMessage());
+    }
+
+    @Test
+    public void testConstructor_And_GetterSetters() throws Exception {
+        Server server = new Server();
+        HttpStatus status = HttpStatus.ACCEPTED_202;
+        String reason = "Success";
+        String operation = "POST";
+        RequestFailedException requestFailedException = new RequestFailedException(operation, reason, status, server);
+        requestFailedException.setOperation(operation);
+        requestFailedException.setReason(reason);
+        requestFailedException.setServerId("A");
+        requestFailedException.setStatus(status);
+        Assert.assertEquals("POST", requestFailedException.getOperation());
+        Assert.assertEquals("Success", requestFailedException.getReason());
+        Assert.assertEquals("A", requestFailedException.getServerId());
+        Assert.assertEquals(HttpStatus.ACCEPTED_202, requestFailedException.getStatus());
+        Assert.assertEquals("A", requestFailedException.getServerId());
+    }
+
+    @Test
+    public void testConstructorWithFiveArguements() throws Exception {
+        String tMessage = "throwable message";
+        Server server = new Server();
+        HttpStatus status = HttpStatus.ACCEPTED_202;
+        String reason = "Success";
+        String operation = "POST";
+        Throwable throwable = new Throwable(tMessage);
+        RequestFailedException requestFailedException = new RequestFailedException(throwable, operation, reason, status,
+                server);
+        Assert.assertEquals(throwable, requestFailedException.getCause());
+
+    }
+
+    @Test
+    public void testConstructorWithFiveArguements_server_Null() throws Exception {
+        String tMessage = "throwable message";
+        Server server = null;
+        HttpStatus status = HttpStatus.ACCEPTED_202;
+        String reason = "Success";
+        String operation = "POST";
+        Throwable throwable = new Throwable(tMessage);
+        RequestFailedException requestFailedException = new RequestFailedException(throwable, operation, reason, status,
+                server);
+        Assert.assertEquals(throwable, requestFailedException.getCause());
+    }
+
+    @Test
+    public void testConstructorWith_Server_Null() throws Exception {
+        Server server = new Server();
+        server.setId("testId");
+        HttpStatus status = HttpStatus.ACCEPTED_202;
+        String reason = "Success";
+        String operation = "POST";
+        RequestFailedException requestFailedException = new RequestFailedException(operation, reason, status, server);
+        requestFailedException.setServer(server);
+        Assert.assertEquals(server, requestFailedException.getServer());
+    }
+
+    @Test
+    public void testConstructorWithMessageAndThrowable() throws Exception {
+        String message = "testing message";
+        String tMessage = "throwable message";
+        Throwable throwable = new Throwable(tMessage);
+        RequestFailedException requestFailedException = new RequestFailedException(message, throwable);
+        Assert.assertEquals(throwable, requestFailedException.getCause());
+        Assert.assertTrue(requestFailedException.getLocalizedMessage().contains(message));
+        Assert.assertTrue(requestFailedException.getMessage().contains(message));
+    }
+
+    @Test
+    public void testConstructorWithFourArguements() throws Exception {
+        String message = "testing message";
+        String tMessage = "throwable message";
+        Throwable throwable = new Throwable(tMessage);
+        RequestFailedException requestFailedException = new RequestFailedException(message, throwable, true, true);
+        Assert.assertEquals(throwable, requestFailedException.getCause());
+        Assert.assertTrue(requestFailedException.getLocalizedMessage().contains(message));
+        Assert.assertTrue(requestFailedException.getMessage().contains(message));
+    }
+
+    @Test
+    public void testConstructorWithThrowable() throws Exception {
+        String message = "testing message";
+        Throwable throwable = new Throwable(message);
+        RequestFailedException requestFailedException = new RequestFailedException(throwable);
+        Assert.assertEquals(throwable, requestFailedException.getCause());
+        Assert.assertTrue(requestFailedException.getLocalizedMessage().contains(message));
+        Assert.assertTrue(requestFailedException.getMessage().contains(message));
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/TestRestAdaptorImpl.java b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/TestRestAdaptorImpl.java
new file mode 100644
index 000000000..3d54519db
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/java/org/onap/ccsdk/sli/adaptors/rest/impl/TestRestAdaptorImpl.java
@@ -0,0 +1,246 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * Copyright (C) 2017 Intel Corp.
+ * =============================================================================
+ * Modifications Copyright (C) 2018 Samsung
+ * ================================================================================
+ * Modifications Copyright (C) 2019 Ericsson
+ * ================================================================================
+ * 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.onap.ccsdk.sli.adaptors.rest.impl;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.apache.http.util.EntityUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * Test the ProviderAdaptor implementation.
+ */
+@Ignore
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({HttpClients.class, SSLContexts.class})
+public class TestRestAdaptorImpl {
+    private RestAdaptorImpl adaptor;
+    private CloseableHttpClient client;
+    private StatusLine statusLine;
+
+    @SuppressWarnings("nls")
+    @BeforeClass
+    public static void once() throws SecurityException {
+
+    }
+
+    @Before
+    public void setup() throws IllegalArgumentException, IOException {
+        client = Mockito.mock(CloseableHttpClient.class);
+        PowerMockito.mockStatic(HttpClients.class);
+        PowerMockito.when(HttpClients.createDefault()).thenReturn(client);
+        CloseableHttpResponse httpResponse = Mockito.mock(CloseableHttpResponse.class);
+        statusLine = Mockito.mock(StatusLine.class);
+        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        Mockito.when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        HttpEntity httpEntity = Mockito.mock(HttpEntity.class);
+        Mockito.when(httpResponse.getEntity()).thenReturn(httpEntity);
+        Mockito.when(client.execute(Mockito.any())).thenReturn(httpResponse);
+        adaptor = new RestAdaptorImpl();
+    }
+
+    @Test
+    public void testCreateHttpRequestGet() throws IOException, IllegalStateException, IllegalArgumentException {
+
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "http://example.com:8080/about/health");
+        params.put("org.onap.appc.instance.haveHeader", "false");
+
+        HttpGet httpGet = ((HttpGet) givenParams(params, "GET"));
+
+        assertEquals("GET", httpGet.getMethod());
+        assertEquals("http://example.com:8080/about/health", httpGet.getURI().toURL().toString());
+    }
+
+    @Test
+    public void testCreateHttpRequestPost() throws IOException, IllegalStateException, IllegalArgumentException {
+
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "http://example.com:8081/posttest");
+        params.put("org.onap.appc.instance.haveHeader", "false");
+        params.put("org.onap.appc.instance.requestBody", "{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
+
+        HttpPost httpPost = ((HttpPost) givenParams(params, "POST"));
+
+        assertEquals("POST", httpPost.getMethod());
+        assertEquals("http://example.com:8081/posttest", httpPost.getURI().toURL().toString());
+        assertEquals("{\"name\":\"MyNode\", \"width\":200, \"height\":100}", EntityUtils.toString(httpPost.getEntity()));
+    }
+
+    @Test
+    public void testCreateRequestInvalidParamPost() throws IllegalStateException, IllegalArgumentException {
+        Mockito.when(statusLine.getStatusCode()).thenReturn(500);
+        SvcLogicContext ctx = new SvcLogicContext();
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "boo");
+        params.put("org.onap.appc.instance.haveHeader", "false");
+        params.put("org.onap.appc.instance.requestBody", "{\"name\":\"MyNode2\", \"width\":300, \"height\":300}");
+
+        adaptor.commonPost(params, ctx);
+
+        assertEquals("failure", ctx.getStatus());
+        assertEquals("500", ctx.getAttribute("org.onap.rest.result.code"));
+        assertEquals("Internal Server Error",
+                ctx.getAttribute("org.onap.rest.result.message"));
+    }
+
+    @Test
+    public void testCreateHttpRequestPut() throws IOException, IllegalStateException, IllegalArgumentException {
+
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "http://example.com:8081/puttest");
+        params.put("org.onap.appc.instance.haveHeader", "false");
+        params.put("org.onap.appc.instance.requestBody", "{\"name\":\"MyNode2\", \"width\":300, \"height\":300}");
+
+        HttpPut httpPut = ((HttpPut) givenParams(params, "PUT"));
+
+        assertEquals("PUT", httpPut.getMethod());
+        assertEquals("http://example.com:8081/puttest", httpPut.getURI().toURL().toString());
+        assertEquals("{\"name\":\"MyNode2\", \"width\":300, \"height\":300}", EntityUtils.toString(httpPut.getEntity()));
+    }
+
+    @Test
+    public void testCreateRequestNoParamPut() throws IllegalStateException, IllegalArgumentException {
+        Mockito.when(statusLine.getStatusCode()).thenReturn(200);
+        SvcLogicContext ctx = new SvcLogicContext();
+        Map params = new HashMap<>();
+
+        adaptor.commonPut(params, ctx);
+
+        assertEquals("success", ctx.getStatus());
+        assertEquals("200", ctx.getAttribute("org.onap.rest.result.code"));
+        assertEquals("java.lang.NullPointerException",
+                ctx.getAttribute("org.onap.rest.result.message"));
+    }
+
+    @Test
+    public void testCreateHttpRequestDelete() throws IOException, IllegalStateException, IllegalArgumentException {
+
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "http://example.com:8081/deletetest");
+        params.put("org.onap.appc.instance.haveHeader", "false");
+
+        HttpDelete httpDelete = ((HttpDelete) givenParams(params, "DELETE"));
+
+        assertEquals("DELETE", httpDelete.getMethod());
+        assertEquals("http://example.com:8081/deletetest", httpDelete.getURI().toURL().toString());
+    }
+
+    @Test
+    public void testCreateRequestNoParamDelete() throws IllegalStateException, IllegalArgumentException {
+        Mockito.when(statusLine.getStatusCode()).thenReturn(400);
+        SvcLogicContext ctx = new SvcLogicContext();
+        Map params = new HashMap<>();
+
+        adaptor.commonDelete(params, ctx);
+
+        assertEquals("failure", ctx.getStatus());
+        assertEquals("400", ctx.getAttribute("org.onap.rest.result.code"));
+        assertEquals("Bad Request",
+                ctx.getAttribute("org.onap.rest.result.message"));
+    }
+
+    @Test
+    public void testDoFailureMultiLineErrorMessage() {
+        Map mockParams = Mockito.mock(Map.class);
+        Mockito.when(mockParams.get("org.onap.appc.instance.URI")).thenThrow(new RuntimeException("\n\n"));
+        adaptor.createHttpRequest("test_method", mockParams, new RequestContext(new SvcLogicContext()));
+        assertNotNull(mockParams);
+    }
+
+    @Test
+    public void testCreateHttpRequestWithHeader() {
+        Map params = new HashMap<>();
+        params.put("org.onap.appc.instance.URI", "http://example.com:8080/about/health");
+        params.put("org.onap.appc.instance.headers", "{\"header1\":\"header1-value\"}");
+        params.put("org.onap.appc.instance.haveHeader", "true");
+
+        HttpGet httpGet = ((HttpGet) givenParams(params, "GET"));
+
+        assertEquals("GET", httpGet.getMethod());
+        assertNotNull(httpGet.getHeaders("header1"));
+    }
+
+    @Test
+    public void testExecuteHttpRequest() {
+        SvcLogicContext ctx = new SvcLogicContext();
+        Map params = new HashMap<>();
+        adaptor.commonGet(params, ctx);
+        assertNotNull(params);
+    }
+
+    @Test
+    public void testExecuteRequestException() throws IOException, IllegalStateException, IllegalArgumentException {
+        Mockito.when(client.execute(Mockito.any())).thenThrow(new IOException());
+        SvcLogicContext ctx = new SvcLogicContext();
+        Map params = new HashMap<>();
+
+        adaptor.commonDelete(params, ctx);
+
+        assertEquals("failure", ctx.getStatus());
+        assertEquals("500", ctx.getAttribute("org.onap.rest.result.code"));
+        assertEquals("java.io.IOException",
+                ctx.getAttribute("org.onap.rest.result.message"));
+    }
+
+    private HttpRequestBase givenParams(Map params, String method) {
+        SvcLogicContext ctx = new SvcLogicContext();
+        RequestContext rc = new RequestContext(ctx);
+        rc.isAlive();
+
+        adaptor = new RestAdaptorImpl();
+        return adaptor.createHttpRequest(method, params, rc);
+    }
+
+}
diff --git a/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/resources/rest-adaptor.properties b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/resources/rest-adaptor.properties
new file mode 100644
index 000000000..bafddeb6b
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-bundle/src/test/resources/rest-adaptor.properties
@@ -0,0 +1,115 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# ============LICENSE_END=========================================================
+###
+
+#
+# Default properties for the APP-C Provider Adaptor
+#
+# -------------------------------------------------------------------------------------------------
+#
+# Define the name and path of any user-provided configuration (bootstrap) file that can be loaded 
+# to supply configuration options 
+org.onap.appc.bootstrap.file=appc.properties
+org.onap.appc.bootstrap.path=/opt/onap/appc/data/properties,${user.home},.
+
+appc.application.name=APPC
+
+#
+# Define the message resource bundle name to be loaded 
+org.onap.appc.resources=org/onap/appc/i18n/MessageResources
+#
+# The name of the adaptor.
+org.onap.appc.provider.adaptor.name=org.onap.appc.appc_provider_adaptor
+#
+# Set up the logging environment
+#
+org.onap.appc.logging.file=org/onap/appc/logback.xml
+org.onap.appc.logging.path=${user.home};etc;../etc
+org.onap.appc.logger=org.onap.appc
+org.onap.appc.security.logger=org.onap.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.onap.appc.provider.min.pool=1
+org.onap.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.onap.appc.provider.retry.delay = 30
+org.onap.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.onap.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.onap.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. 
+#
+
+
+###																###
+### Properties commented out below provided in appc.properties  ###
+###																###
+
+# Don't change these 2 right now since they are hard coded in the DG
+#provider1.type=appc
+#provider1.name=appc
+
+#These you can change
+#provider1.identity=appc
+#provider1.tenant1.name=appc
+#provider1.tenant1.userid=appc
+#provider1.tenant1.password=appc
+
+# After a change to the provider make sure to recheck these values with an api call to provider1.identity/tokens
+test.expected-regions=1
+test.expected-endpoints=1
+
+#Your OpenStack IP
+#test.ip=192.168.1.2
+# Your OpenStack Platform's Keystone Port (default is 5000)
+#test.port=5000
+#test.tenantid=abcde12345fghijk6789lmnopq123rst
+#test.vmid=abc12345-1234-5678-890a-abcdefg12345
+# Port 8774 below is default port for OpenStack's Nova API Service
+#test.url=http://192.168.1.2:8774/v2/abcde12345fghijk6789lmnopq123rst/servers/abc12345-1234-5678-890a-abcdefg12345
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-installer/pom.xml b/adaptors/rest-adaptor/rest-adaptor-installer/pom.xml
new file mode 100644
index 000000000..e8976260f
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-installer/pom.xml
@@ -0,0 +1,157 @@
+
+
+
+    4.0.0
+
+    
+        org.onap.ccsdk.parent
+        odlparent-lite
+        2.2.0-SNAPSHOT
+        
+    
+
+    org.onap.ccsdk.sli.adaptors
+    rest-adaptor-installer
+    1.3.0-SNAPSHOT
+    pom
+
+    ccsdk-sli-adaptors :: ${project.artifactId}
+
+    
+        ccsdk-rest-adaptor
+        ${application.name}
+        mvn:org.onap.ccsdk.sli.adaptors/${features.boot}/${project.version}/xml/features
+        false
+    
+
+    
+        
+            org.onap.ccsdk.sli.adaptors
+            ccsdk-rest-adaptor
+            ${project.version}
+            xml
+            features
+            
+                
+                    *
+                    *
+                
+            
+        
+
+        
+            org.onap.ccsdk.sli.adaptors
+            rest-adaptor-bundle
+            ${project.version}
+        
+    
+
+    
+        
+            
+                maven-assembly-plugin
+                
+                    
+                        maven-repo-zip
+                        
+                            single
+                        
+                        package
+                        
+                            false
+                            false
+                            stage/${application.name}-${project.version}
+                            
+                                src/assembly/assemble_mvnrepo_zip.xml
+                            
+                        
+                    
+                    
+                        installer-zip
+                        
+                            single
+                        
+                        package
+                        
+                            false
+                            true
+                            ${application.name}-${project.version}
+                            
+                                src/assembly/assemble_installer_zip.xml
+                            
+                        
+                    
+                
+            
+            
+                org.apache.maven.plugins
+                maven-dependency-plugin
+                
+                    
+                        copy-dependencies
+                        
+                            copy-dependencies
+                        
+                        prepare-package
+                        
+                            false
+                            ${project.build.directory}/assembly/system
+                            false
+                            true
+                            true
+                            true
+                            false
+                            false
+                            org.opendaylight
+                            provided
+                        
+                    
+                
+            
+            
+                maven-resources-plugin
+                
+                    
+                        copy-version
+                        
+                            copy-resources
+                        
+                        
+                        validate
+                        
+                            ${basedir}/target/stage
+                            
+                                
+                                    src/main/resources/scripts
+                                    
+                                        install-feature.sh
+                                    
+                                    true
+                                
+                            
+                        
+                    
+                
+            
+        
+    
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_installer_zip.xml b/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_installer_zip.xml
new file mode 100644
index 000000000..0726ee13e
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_installer_zip.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+	adaptor
+	
+		zip
+	
+
+	
+	false
+
+	
+		
+			target/stage/
+			${application.name}
+			755
+			
+				*.sh
+			
+		
+		
+			target/stage/
+			${application.name}
+			644
+			
+				*.sh
+			
+		
+	
+
+
+
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml b/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644
index 000000000..657f337ee
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-installer/src/assembly/assemble_mvnrepo_zip.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+	adaptor
+	
+		zip
+	
+
+	
+	false
+
+	
+		
+			target/assembly/
+			.
+			
+			
+		
+	
+
+
diff --git a/adaptors/rest-adaptor/rest-adaptor-installer/src/main/resources/scripts/install-feature.sh b/adaptors/rest-adaptor/rest-adaptor-installer/src/main/resources/scripts/install-feature.sh
new file mode 100644
index 000000000..f5d3d28e7
--- /dev/null
+++ b/adaptors/rest-adaptor/rest-adaptor-installer/src/main/resources/scripts/install-feature.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# ONAP : APPC
+# ================================================================================
+# Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Copyright (C) 2017 Amdocs
+# =============================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+# 
+#      http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+# ============LICENSE_END=========================================================
+###
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-""}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+	unzip -n -d ${ODL_HOME} ${REPOZIP}
+
+fi
+
+COUNT=0
+while [ $COUNT -lt 10 ]; do
+#	${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories} 2> /tmp/installErr
+sshpass -pkaraf ssh -o StrictHostKeyChecking=no karaf@localhost -p 8101 "feature:repo-add ${features.repositories}" 2> /tmp/installErr
+	cat /tmp/installErr
+	if grep -q 'Failed to get the session' /tmp/installErr; then
+		sleep 10
+	else
+		let COUNT=10
+	fi
+	let COUNT=COUNT+1
+done
diff --git a/adaptors/sql-resource/installer/pom.xml b/adaptors/sql-resource/installer/pom.xml
index b1a07ca04..891eee20c 100755
--- a/adaptors/sql-resource/installer/pom.xml
+++ b/adaptors/sql-resource/installer/pom.xml
@@ -90,7 +90,7 @@
                             true
                             false
                             false
-                            org.onap.ccsdk.sli.adaptor
+                            org.onap.ccsdk.sli.adaptors
                             provided
                         
                     
diff --git a/adaptors/ssh-adaptor/pom.xml b/adaptors/ssh-adaptor/pom.xml
index b57be0401..0913769cd 100644
--- a/adaptors/ssh-adaptor/pom.xml
+++ b/adaptors/ssh-adaptor/pom.xml
@@ -59,5 +59,4 @@
             
         
     
-
 
diff --git a/plugins/features/ccsdk-sshapi-call-node/pom.xml b/plugins/features/ccsdk-sshapi-call-node/pom.xml
index 7e8fe4231..0b85f55ee 100644
--- a/plugins/features/ccsdk-sshapi-call-node/pom.xml
+++ b/plugins/features/ccsdk-sshapi-call-node/pom.xml
@@ -15,7 +15,6 @@
     feature
 
     ccsdk-sli-plugins :: features :: ${project.artifactId}
-