Add multi-cloud pike csit scripts

Change-Id: I1e1ba5271313453531019e5255dbe94923680abb
Issue-ID: MULTICLOUD-276
Signed-off-by: Huang Haibin <haibin.huang@intel.com>
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/Dockerfile b/test/csit/scripts/multicloud-pike/generic_sim/Dockerfile
new file mode 100644
index 0000000..688b58a
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/Dockerfile
@@ -0,0 +1,12 @@
+FROM python:2.7
+
+EXPOSE 8080
+
+RUN mkdir -p /{tmp,etc}/generic_sim
+
+WORKDIR /opt/generic_sim/
+
+COPY . .
+RUN pip install --no-cache-dir -r requirements.txt
+
+CMD [ "python", "generic_sim.py" ]
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/aai/responses.yml b/test/csit/scripts/multicloud-pike/generic_sim/aai/responses.yml
new file mode 100644
index 0000000..2762807
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/aai/responses.yml
@@ -0,0 +1,189 @@
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+  GET:
+    body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://keystone:8080/v3","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845154715"}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","Node
+      Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/internal","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","Node
+      Not Found:No Node of type availability-zone found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/availability-zones/availability-zone/nova","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/100","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/110","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/111","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/112","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/113","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/114","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/115","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/116","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","Node
+      Not Found:No Node of type flavor found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/flavors/flavor/117","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","Node
+      Not Found:No Node of type image found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/images/image/660709df-e90b-471f-ac57-d8c2555e573d","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","Node
+      Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/3543226ffed44daf90a2f71f36c00b8d","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","Node
+      Not Found:No Node of type tenant found at: cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/tenants/tenant/b8f5d85bbcd84af28d7caa62d39f05c7","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne:
+  GET:
+    body: '{"cloud-owner":"CloudOwner","cloud-region-id":"RegionOne","cloud-type":"openstack","owner-defined-type":"t1","cloud-region-version":"RegionOne","identity-url":"http://multicloud-pike:80/api/multicloud-titanium_cloud/v0/CloudOwner_RegionOne/identity/v2.0","cloud-zone":"z1","complex-name":"clli1","sriov-automation":false,"cloud-extra-info":"","resource-version":"1524845276291"}'
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/cloud-regions/cloud-region/CloudOwner/RegionOne/esr-system-info-list:
+  GET:
+    body: '{"esr-system-info":[{"esr-system-info-id":"4ce895ad-82f7-4476-b5eb-d19d19585da2","service-url":"http://keystone:8080/v3","user-name":"admin","password":"secret","system-type":"VIM","ssl-insecure":true,"cloud-domain":"Default","default-tenant":"admin","resource-version":"1524845155617"}]}'
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0:
+  GET:
+    body: '{"requestError":{"serviceException":{"messageId":"SVC3001","text":"Resource
+      not found for %1 using id %2 (msg=%3) (ec=%4)","variables":["GET","cloud-infrastructure/pservers/pserver/compute-0","Node
+      Not Found:No Node of type pserver found at: cloud-infrastructure/pservers/pserver/compute-0","ERR.5.4.6114"]}}}'
+    content_type: application/json
+    status_code: 200
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
+aai/v13/cloud-infrastructure/pservers/pserver/compute-0/relationship-list/relationship:
+  PUT:
+    body: ''
+    content_type: application/json
+    status_code: 200
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/cinder/responses.yml b/test/csit/scripts/multicloud-pike/generic_sim/cinder/responses.yml
new file mode 100644
index 0000000..d9657a5
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/cinder/responses.yml
@@ -0,0 +1,5 @@
+/snapshots/detail:
+  get:
+    body: '{"snapshots": []}'
+    content_type: application/json
+    status_code: 200
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/generic_sim.py b/test/csit/scripts/multicloud-pike/generic_sim/generic_sim.py
new file mode 100644
index 0000000..4392b65
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/generic_sim.py
@@ -0,0 +1,109 @@
+# Copyright 2018 Intel Corporation, Inc
+# 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.
+
+import json
+import logging
+
+import web
+from web import webapi
+import yaml
+
+urls = (
+  '/(.*)','MockController'
+)
+
+def setup_logger(name, log_file, level=logging.DEBUG):
+    print("Configuring the logger...")
+    handler = logging.FileHandler(log_file)
+    formatter = logging.Formatter('%(message)s')
+    handler.setFormatter(formatter)
+
+    logger = logging.getLogger(name)
+    logger.setLevel(level)
+    logger.addHandler(handler)
+
+    return logger
+
+
+class MockResponse:
+    def __init__(self, http_verb, status_code,
+                 content_type="application/json", body="{}",
+                 headers={}):
+        self.http_verb = http_verb.lower()
+        self.status_code = status_code
+        self.content_type = content_type
+        self.body = body
+        self.headers = headers
+
+def _parse_responses(parsed_responses):
+    result = {}
+    for path, responses in parsed_responses.iteritems():
+        new_path = path
+        if path.startswith("/"):
+            new_path = path[1:]
+
+        result[new_path] = []
+        for http_verb, response in responses.iteritems():
+            result[new_path].append(MockResponse(http_verb, **response))
+    return result
+
+def load_responses(filename):
+    print("Loading responses from configuration file..")
+    with open(filename) as yaml_file:
+        responses_file = yaml.safe_load(yaml_file)
+    responses_map = _parse_responses(responses_file)
+    return responses_map
+
+
+class MockController:
+
+    def _do_action(self, action):
+        logger.info('{}'.format(web.ctx.env.get('wsgi.input').read()))
+        action = action.lower()
+        url = web.ctx['fullpath']
+        try:
+            if url.startswith("/"):
+                url = url[1:]
+            response = [ r for r in responses_map[url] if r.http_verb == action][0]
+            for header, value in response.headers.iteritems():
+                web.header(header, value)
+            web.header('Content-Type', response.content_type)
+            print(response.body)
+            return response.body
+        except:
+            webapi.NotFound()
+
+    def DELETE(self, url):
+        return self._do_action("delete")
+
+    def HEAD(self, url):
+        return self._do_action("head")
+
+    def PUT(self, url):
+        return self._do_action("put")
+
+    def GET(self, url):
+        return self._do_action("get")
+
+    def POST(self, url):
+        return self._do_action("post")
+
+    def PATCH(self, url):
+        return self._do_action("patch")
+
+
+logger = setup_logger('mock_controller', '/tmp/generic_sim/output.log')
+responses_map = load_responses('/etc/generic_sim/responses.yml')
+app = web.application(urls, globals())
+if __name__ == "__main__":
+    app.run()
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/glance/responses.yml b/test/csit/scripts/multicloud-pike/generic_sim/glance/responses.yml
new file mode 100644
index 0000000..d842235
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/glance/responses.yml
@@ -0,0 +1,73 @@
+/v2/images:
+  get:
+    body: '{"images": [{"status": "active", "schema": "/v2/schemas/image",
+      "virtual_size": null, "description": "", "tags": [], "container_format":
+      "bare", "created_at": "2018-04-21T06:12:13Z", "disk_format": "raw",
+      "updated_at": "2018-04-21T06:12:24Z", "visibility": "public", "id":
+      "660709df-e90b-471f-ac57-d8c2555e573d", "owner": "b8f5d85bbcd84af28d7caa62d39f05c7",
+      "protected": false, "min_ram": 0, "file": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d/file",
+      "checksum": "683f86920d4c922cb5c55d99d646b895", "min_disk": 0, "size":
+      1697597440, "self": "/v2/images/660709df-e90b-471f-ac57-d8c2555e573d", "store":
+      "file", "name": "tis4-centos-guest"}], "first": "/v2/images", "schema":
+      "/v2/schemas/images"}'
+    content_type: application/json
+    status_code: 200
+/v2/schemas/image:
+  get:
+    body: '{"additionalProperties": {"type": "string"}, "name": "image",
+      "links": [{"href": "{self}", "rel": "self"}, {"href": "{file}",
+      "rel": "enclosure"}, {"href": "{schema}", "rel": "describedby"}],
+      "properties": {"container_format": {"enum": [null, "ami", "ari", "aki",
+      "bare", "ovf", "ova", "docker"], "type": ["null", "string"], "description":
+      "Format of the container"}, "min_ram": {"type": "integer", "description":
+      "Amount of ram (in MB) required to boot image."}, "ramdisk_id": {"pattern":
+      "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+      "type": ["null", "string"], "description": "ID of image stored in Glance
+      that should be used as the ramdisk when booting an AMI-style image.", "is_base":
+      false}, "locations": {"items": {"required": ["url", "metadata"], "type":
+      "object", "properties": {"url": {"type": "string", "maxLength":
+      255}, "metadata": {"type": "object"}}}, "type": "array", "description":
+      "A set of URLs to access the image file kept in external store"}, "file":
+      {"readOnly": true, "type": "string", "description": "An image file
+      url"}, "owner": {"type": ["null", "string"], "description": "Owner
+      of the image", "maxLength": 255}, "id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+      "type": "string", "description": "An identifier for the image"}, "size":
+      {"readOnly": true, "type": ["null", "integer"], "description": "Size
+      of image file in bytes"}, "os_distro": {"type": "string", "description":
+      "Common name of operating system distribution as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+      "is_base": false}, "self": {"readOnly": true, "type": "string", "description":
+      "An image self url"}, "disk_format": {"enum": [null, "ami", "ari",
+      "aki", "vhd", "vhdx", "vmdk", "raw", "qcow2", "vdi", "iso",
+      "ploop"], "type": ["null", "string"], "description": "Format of the
+      disk"}, "os_version": {"type": "string", "description": "Operating
+      system version as specified by the distributor", "is_base": false}, "direct_url":
+      {"readOnly": true, "type": "string", "description": "URL to access
+      the image file kept in external store"}, "schema": {"readOnly": true, "type":
+      "string", "description": "An image schema url"}, "status": {"readOnly":
+      true, "enum": ["queued", "saving", "active", "killed", "deleted",
+      "pending_delete", "deactivated"], "type": "string", "description":
+      "Status of the image"}, "tags": {"items": {"type": "string", "maxLength":
+      255}, "type": "array", "description": "List of strings related to the
+      image"}, "kernel_id": {"pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
+      "type": ["null", "string"], "description": "ID of image stored in Glance
+      that should be used as the kernel when booting an AMI-style image.", "is_base":
+      false}, "visibility": {"enum": ["community", "public", "private",
+      "shared"], "type": "string", "description": "Scope of image accessibility"},
+      "updated_at": {"readOnly": true, "type": "string", "description":
+      "Date and time of the last image modification"}, "min_disk": {"type":
+      "integer", "description": "Amount of disk space (in GB) required to boot
+      image."}, "virtual_size": {"readOnly": true, "type": ["null", "integer"],
+      "description": "Virtual size of image in bytes"}, "instance_uuid": {"type":
+      "string", "description": "Metadata which can be used to record which instance
+      this image is associated with. (Informational only, does not create an instance
+      snapshot.)", "is_base": false}, "name": {"type": ["null", "string"],
+      "description": "Descriptive name for the image", "maxLength": 255}, "checksum":
+      {"readOnly": true, "type": ["null", "string"], "description": "md5
+      hash of image contents.", "maxLength": 32}, "created_at": {"readOnly":
+      true, "type": "string", "description": "Date and time of image registration"},
+      "protected": {"type": "boolean", "description": "If true, image will
+      not be deletable."}, "architecture": {"type": "string", "description":
+      "Operating system architecture as specified in https://docs.openstack.org/python-glanceclient/latest/cli/property-keys.html",
+      "is_base": false}}}'
+    content_type: application/json
+    status_code: 200
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/keystone/responses.yml b/test/csit/scripts/multicloud-pike/generic_sim/keystone/responses.yml
new file mode 100644
index 0000000..422ec7b
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/keystone/responses.yml
@@ -0,0 +1,44 @@
+projects:
+  get:
+    body: '{"projects": [{"is_domain": false, "description": "admin tenant",
+      "links": {"self": "http://keystone:8080/v3/projects/b8f5d85bbcd84af28d7caa62d39f05c7"},
+      "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+      "b8f5d85bbcd84af28d7caa62d39f05c7", "name": "admin"}, {"is_domain":
+      false, "description": "Tenant for the openstack services", "links": {"self":
+      "http://keystone:8080/v3/projects/3543226ffed44daf90a2f71f36c00b8d"},
+      "enabled": true, "domain_id": "default", "parent_id": "default", "id":
+      "3543226ffed44daf90a2f71f36c00b8d", "name": "services"}], "links": {"self":
+      "http://keystone:8080/v3/projects", "next": null, "previous": null}}'
+    content_type: application/json
+    status_code: 200
+v3/auth/tokens:
+  post:
+    body: '{"token": {"methods": ["password"], "expires_at": "2019-11-06T15:32:17.893769Z",
+      "user": { "domain": {"id": "default", "name": "Default"},
+      "id": "423f19a4ac1e4f48bbb4180756e6eb6c", "name": "admin", "password_expires_at": null },
+      "audit_ids": [ "ZzZwkUflQfygX7pdYDBCQQ"], "catalog": [ 
+      { "endpoints": [ 
+      { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://keystone:8080" },
+      { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://keystone:8080" },
+      { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://keystone:8080" }
+      ], "id": "1", "type": "identity", "name": "keystone"},
+      { "endpoints": [ 
+      { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://glance:8080" },
+      { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://glance:8080" },
+      { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://glance:8080" }
+      ], "id": "2", "type": "image", "name": "glance"},
+      { "endpoints": [ 
+      { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://cinder:8080" },
+      { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://cinder:8080" },
+      { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://cinder:8080" }
+      ], "id": "2", "type": "volumev3", "name": "cinder"},
+      { "endpoints": [ 
+      { "id": "1", "interface": "public", "region": "RegionOne", "url": "http://nova:8080" },
+      { "id": "2", "interface": "internal", "region": "RegionOne", "url": "http://nova:8080" },
+      { "id": "3", "interface": "admin", "region": "RegionOne", "url": "http://nova:8080" }
+      ], "id": "3", "type": "compute", "name": "nova"}],
+      "issued_at": "2015-11-06T14:32:17.893797Z"}}'
+    content_type: application/json
+    status_code: 200
+    headers:
+      X-Subject-Token: 423f19a4ac1e4f48bbb4180756e6eb6c
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/log_parser.py b/test/csit/scripts/multicloud-pike/generic_sim/log_parser.py
new file mode 100644
index 0000000..1334e60
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/log_parser.py
@@ -0,0 +1,61 @@
+import argparse
+
+import yaml
+
+
+def _find_aai_response_content(inp):
+    return inp.split("||||")[1].split("with response content = ")[1]
+
+def _find_openstack_url(inp):
+    return inp.split("||||")[1].split("making request with URI:")[1]
+
+def _find_openstack_response_content(inp):
+    return inp.split("||||")[1].split("with content:")[1].replace("u'", "'")
+
+def _add_response(all_responses, url, http_verb, body, status_code=200, content_type="application/json"):
+    if url not in all_responses.keys():
+        all_responses[url] = {
+            http_verb: {
+                "status_code": status_code,
+                "content_type": content_type,
+                "body": body
+            }
+        }
+    elif http_verb not in all_responses[url].keys():
+        all_responses[url][http_verb] = {
+            "status_code": status_code,
+            "content_type": content_type,
+            "body": body
+        }
+
+def parse_lines(content, aai_ip):
+    aai_pattern = "https://%s:30233/" % aai_ip
+    openstack_pattern = "making request with URI:"
+
+    openstack_responses = {}
+    aai_responses = {}
+    for i, line in enumerate(content):
+        current_line = line.strip()
+        if aai_pattern in current_line and "DEBUG" not in current_line:
+            url = current_line.split(" ")[8][:-1].replace(aai_pattern, "")
+            _add_response(aai_responses, url, current_line.split(" ")[9][:-1],
+                _find_aai_response_content(content[i + 3]))
+        elif openstack_pattern in current_line:
+            _add_response(openstack_responses,
+                _find_openstack_url(current_line), "get",
+                _find_openstack_response_content(content[i + 2]))
+
+    return [
+    { "file": "nova.yml", "responses": openstack_responses },
+    { "file": "aai.yml", "responses": aai_responses }
+    ]
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description='Convert logs to responses YAML tree file.')
+    parser.add_argument('--log-file', type=argparse.FileType('r'), help="Log file to be parsed", required=True)
+    parser.add_argument('--aai-ip', help="A&AI IP Address", required=True)
+    args = parser.parse_args()
+
+    for mock_responses in parse_lines(args.log_file.readlines(), args.aai_ip):
+        with open(mock_responses["file"], 'w') as yaml_file:
+            yaml.dump(mock_responses["responses"], yaml_file, default_flow_style=False)
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/nova/responses.yml b/test/csit/scripts/multicloud-pike/generic_sim/nova/responses.yml
new file mode 100644
index 0000000..9446971
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/nova/responses.yml
@@ -0,0 +1,177 @@
+/flavors/110/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:mem_page_size":
+      "large", "hw:cpu_sockets": "2", "hw:cpu_threads": "8", "hw:numa_mem.1":
+      "2048", "hw:numa_mem.0": "2048", "hw:capabilities:cpu_info:features":
+      "avx,acpi", "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+      "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3,4,5", "hw:cpu_cores":
+      "4", "hw:cpu_thread_policy": "prefer", "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:4"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/111/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/112/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"hw:cpu_policy": "dedicated", "hw:cpu_thread_policy":
+      "isolate", "aggregate_instance_extra_specs:storage": "local_image"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/113/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"hw:cpu_cores": "8", "hw:cpu_threads": "16",
+      "aggregate_instance_extra_specs:storage": "local_image", "hw:cpu_sockets":
+      "2"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/114/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+      "hw:mem_page_size": "small"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/115/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"hw:numa_mem.1": "1024", "hw:numa_mem.0": "1024",
+      "aggregate_instance_extra_specs:storage": "local_image", "hw:numa_nodes":
+      "2", "hw:numa_cpus.0": "0,1", "hw:numa_cpus.1": "2,3"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/116/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"hw:capabilities:cpu_info:features": "avx,aes",
+      "aggregate_instance_extra_specs:storage": "local_image"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/117/os-extra_specs:
+  get:
+    body: '{"extra_specs": {"aggregate_instance_extra_specs:storage": "local_image",
+      "pci_passthrough:alias": "sriov-vf-intel-8086-15b3:6"}}'
+    content_type: application/json
+    status_code: 200
+/flavors/detail:
+  get:
+    body: '{"flavors": [{"name": "f.small", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/100",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "100"}, {"name":
+      "onap.hpa.all", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/110",
+      "rel": "bookmark"}], "ram": 4096, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 6, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "110"}, {"name":
+      "onap.hpa.basic", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/111",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "111"}, {"name":
+      "onap.hpa.cpupinning", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/112",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "112"}, {"name":
+      "onap.hpa.cputopology", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/113",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "113"}, {"name":
+      "onap.hpa.hugepage", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/114",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "114"}, {"name":
+      "onap.hpa.numa", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/115",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 4, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "115"}, {"name":
+      "onap.hpa.instruction", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/116",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "116"}, {"name":
+      "onap.hpa.passthrough", "links": [{"href": "http://nova:8080/v2.1/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+      "rel": "self"}, {"href": "http://nova:8080/b8f5d85bbcd84af28d7caa62d39f05c7/flavors/117",
+      "rel": "bookmark"}], "ram": 2048, "OS-FLV-DISABLED:disabled": false,
+      "vcpus": 2, "swap": "", "os-flavor-access:is_public": true, "rxtx_factor":
+      1.0, "OS-FLV-EXT-DATA:ephemeral": 0, "disk": 0, "id": "117"}]}'
+    content_type: application/json
+    status_code: 200
+/os-availability-zone/detail:
+  get:
+    body: '{"availabilityZoneInfo": [{"zoneState": {"available": true}, "hosts":
+      {"controller-0": {"nova-conductor": {"available": true, "active": true,
+      "updated_at": "2018-04-27T16:05:25.272674"}, "nova-consoleauth": {"available":
+      true, "active": true, "updated_at": "2018-04-27T16:05:21.875274"}, "nova-scheduler":
+      {"available": true, "active": true, "updated_at": "2018-04-27T16:05:25.286846"}}},
+      "zoneName": "internal"}, {"zoneState": {"available": false}, "hosts":
+      null, "zoneName": "nova"}]}'
+    content_type: application/json
+    status_code: 200
+/os-hypervisors/detail:
+  get:
+    body: '{
+	"hypervisors": [{
+		"status": "disabled",
+		"service": {
+			"host": "compute-0",
+			"disabled_reason": null,
+			"id": 11
+		},
+		"vcpus_used": 0.0,
+		"hypervisor_type": "QEMU",
+		"id": 1,
+		"local_gb_used": 0,
+		"state": "down",
+		"hypervisor_hostname": "compute-0",
+		"host_ip": "192.168.204.162",
+		"memory_mb": 51562,
+		"current_workload": 0,
+		"vcpus": 42,
+		"free_ram_mb": 51562,
+		"running_vms": 0,
+		"free_disk_gb": 1740,
+		"hypervisor_version": 2010000,
+		"disk_available_least": 1740,
+		"local_gb": 1833,
+		"cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a    pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+		"memory_mb_used ": 0
+	}]
+}'
+    content_type: application/json
+    status_code: 200
+/os-hypervisors/detail?hypervisor_hostname_pattern=controller-0:
+  get:
+    body: '{
+	"hypervisors": [{
+		"status": "disabled",
+		"service": {
+			"host": "compute-0",
+			"disabled_reason": null,
+			"id": 11
+		},
+		"vcpus_used": 0.0,
+		"hypervisor_type": "QEMU",
+		"id": 1,
+		"local_gb_used": 0,
+		"state": "down",
+		"hypervisor_hostname": "compute-0",
+		"host_ip": "192.168.204.162",
+		"memory_mb": 51562,
+		"current_workload": 0,
+		"vcpus": 42,
+		"free_ram_mb": 51562,
+		"running_vms": 0,
+		"free_disk_gb": 1740,
+		"hypervisor_version": 2010000,
+		"disk_available_least": 1740,
+		"local_gb": 1833,
+		"cpu_info": "{\"vendor\": \"Intel\", \"model\": \"IvyBridge\", \"arch\": \"x86_64\", \"features\": [\"pge\", \"avx\", \"xsaveopt\", \"clflush\", \"sep\", \"syscall\",\"tsc-deadline\",\"dtes64\",\"msr\",\"fsgsbase\",\"xsave\",\"vmx\",\"erms\",\"xtpr\",\"cmov\",\"smep\",\"pcid\",\"est\",\"pat\",\"monitor\",\"smx\",\"pbe\",\"lm\",\"tsc\",\"nx\",\"fxsr\",\"tm\",\"sse4.1\",\"pae\",\"sse4.2\",\"pclmuldq\",\"acpi\",\"vme\",\"popcnt\",\"mmx\",\"osxsave\",\"cx8\",\"mce\",\"de\",\"rdtscp\",\"ht\",\"dca\",\"lahf_lm\",\"pdcm\",\"mca\",\"pdpe1gb\",\"a    pic\",\"sse\",\"f16c\",\"pse\",\"ds\",\"invtsc\",\"pni\",\"tm2\",\"aes\",\"sse2\",\"ss\",\"ds_cpl\",\"arat\",\"ssse3\",\"fpu\",\"cx16\",\"pse36\",\"mtrr\",\"rdrand\",\"x2apic\"],\"topology\": {\"cores\": 12,\"cells\": 2,\"threads\": 2,\"sockets\": 1}}",
+		"memory_mb_used ": 0
+	}]
+}'
+    content_type: application/json
+    status_code: 200
diff --git a/test/csit/scripts/multicloud-pike/generic_sim/requirements.txt b/test/csit/scripts/multicloud-pike/generic_sim/requirements.txt
new file mode 100644
index 0000000..ac1d7dd
--- /dev/null
+++ b/test/csit/scripts/multicloud-pike/generic_sim/requirements.txt
@@ -0,0 +1,2 @@
+PyYAML
+web.py
diff --git a/test/csit/tests/multicloud-pike/provision/hpa_multicloud.robot b/test/csit/tests/multicloud-pike/provision/hpa_multicloud.robot
new file mode 100644
index 0000000..f96b542
--- /dev/null
+++ b/test/csit/tests/multicloud-pike/provision/hpa_multicloud.robot
@@ -0,0 +1,17 @@
+*** settings ***
+Library     Collections
+Library     RequestsLibrary
+
+*** Variables ***
+@{return_ok_list}=   		200  201  202
+${queryregistration_url}	/api/multicloud-pike/v0/CloudOwner_RegionOne/registry
+
+
+*** Test Cases ***
+OcataRegistryTest
+    [Documentation]		Register openstack cloud resources
+    ${headers}    		Create Dictionary	Content-Type=application/json		Accept=application/json
+    Create Session		web_session		http://${SERVICE_IP}:${SERVICE_PORT}	headers=${headers}
+    ${resp}=			Post Request		web_session				${queryregistration_url}
+    ${response_code}=		Convert To String	${resp.status_code}
+    List Should Contain Value	${return_ok_list}	${response_code}
diff --git a/test/csit/tests/multicloud-pike/provision/sanity_test_multicloud.robot b/test/csit/tests/multicloud-pike/provision/sanity_test_multicloud.robot
new file mode 100644
index 0000000..36fcea3
--- /dev/null
+++ b/test/csit/tests/multicloud-pike/provision/sanity_test_multicloud.robot
@@ -0,0 +1,22 @@
+*** settings ***
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     json
+
+*** Variables ***
+@{return_ok_list}=   200  201  202
+${queryswagger_pike_url}    /api/multicloud-pike/v0/swagger.json
+
+
+*** Test Cases ***
+OcataSwaggerTest
+    [Documentation]    query swagger info rest test
+    ${headers}    Create Dictionary    Content-Type=application/json    Accept=application/json
+    Create Session    web_session    http://${SERVICE_IP}:${SERVICE_PORT}    headers=${headers}
+    ${resp}=  Get Request    web_session    ${queryswagger_pike_url}
+    ${response_code}=     Convert To String      ${resp.status_code}
+    List Should Contain Value    ${return_ok_list}   ${response_code}
+    ${response_json}    json.loads    ${resp.content}
+    ${swagger_version}=    Convert To String      ${response_json['swagger']}
+    Should Be Equal    ${swagger_version}    2.0