Move CSIT to integration/csit repo

To facilite branching of CSIT tests, all CSIT test
code and scripts are relocated to the integration/csit
repo.

Change-Id: I1e4c0eff44691f73f8098b3c52764107f6b8b8df
Issue-ID: INT-671
Signed-off-by: Gary Wu <gary.i.wu@huawei.com>
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py
new file mode 100644
index 0000000..52d7e0e
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/ConsulLibrary.py
@@ -0,0 +1,16 @@
+from robot.api import logger
+import HttpRequests
+
+CONSUL_NAME = "Consul"
+
+class ConsulLibrary:
+
+    def publish_hv_ves_configuration_in_consul(self, consul_url, consul_configuration_filepath):
+        logger.info("Reading consul configuration file from: " + consul_configuration_filepath)
+        file = open(consul_configuration_filepath, "rb")
+        data = file.read()
+        file.close()
+
+        logger.info("PUT at: " + consul_url)
+        resp = HttpRequests.session_without_env().put(consul_url, data=data, timeout=5)
+        HttpRequests.checkStatusCode(resp.status_code, CONSUL_NAME)
\ No newline at end of file
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py
new file mode 100644
index 0000000..9edad2c
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/DcaeAppSimulatorLibrary.py
@@ -0,0 +1,46 @@
+import HttpRequests
+from robot.api import logger
+
+DCAE_APP_NAME = "DCAE App"
+
+
+class DcaeAppSimulatorLibrary:
+
+    def configure_dcae_app_simulator_to_consume_messages_from_topics(self, app_url, topics):
+        logger.info("PUT at: " + app_url)
+        resp = HttpRequests.session_without_env().put(app_url, data={'topics': topics}, timeout=10)
+        HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+    def assert_DCAE_app_consumed(self, app_url, expected_messages_amount):
+        logger.info("GET at: " + app_url)
+        resp = HttpRequests.session_without_env().get(app_url, timeout=10)
+        HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+        assert resp.content == expected_messages_amount, \
+            "Messages consumed by simulator: " + resp.content + " expecting: " + expected_messages_amount
+
+    def assert_DCAE_app_consumed_less_equal_than(self, app_url, messages_threshold):
+        logger.info("GET at: " + app_url)
+        resp = HttpRequests.session_without_env().get(app_url, timeout=10)
+        HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+        logger.debug("Messages consumed by simulator: " + resp.content +
+                     " expecting more than 0 and less/equal than " + messages_threshold)
+
+        assert 0 < int(resp.content) <= int(messages_threshold), \
+            "Messages consumed by simulator: " + resp.content + \
+            " expecting more than 0 and less/equal than " + messages_threshold
+
+    def reset_DCAE_app_simulator(self, app_url):
+        logger.info("DELETE at: " + app_url)
+        resp = HttpRequests.session_without_env().delete(app_url, timeout=10)
+        HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
+
+    def assert_DCAE_app_consumed_proper_messages(self, app_url, message_filepath):
+        logger.info("POST at: " + app_url)
+        file = open(message_filepath, "rb")
+        data = file.read()
+        file.close()
+
+        resp = HttpRequests.session_without_env().post(app_url, data=data, timeout=10)
+        HttpRequests.checkStatusCode(resp.status_code, DCAE_APP_NAME)
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py
new file mode 100644
index 0000000..c0dcd81
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/HttpRequests.py
@@ -0,0 +1,19 @@
+import requests
+from robot.api import logger
+
+valid_status_codes = [
+    requests.codes.ok,
+    requests.codes.accepted
+]
+
+
+def session_without_env():
+    session = requests.Session()
+    session.trust_env = False
+    return session
+
+
+def checkStatusCode(status_code, server_name):
+    if status_code not in valid_status_codes:
+        logger.error("Response status code from " + server_name + ": " + str(status_code))
+        raise (Exception(server_name + " returned status code " + status_code))
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py
new file mode 100644
index 0000000..989a796
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/VesHvContainersUtilsLibrary.py
@@ -0,0 +1,69 @@
+from time import time
+
+from robot.api import logger
+import os.path
+import docker
+from io import BytesIO
+from os.path import basename
+from tarfile import TarFile, TarInfo
+
+LOCALHOST = "localhost"
+
+
+class VesHvContainersUtilsLibrary:
+
+    def get_consul_api_access_url(self, method, image_name, port):
+        return self.create_url(
+            method,
+            self.get_instance_address(image_name, port)
+        )
+
+    def get_xnf_sim_api_access_url(self, method, host):
+        if is_running_inside_docker():
+            return self.create_url(method, host)
+        else:
+            logger.info("File `/.dockerenv` not found. Assuming local environment and using localhost.")
+            port_from_container_name = str(host)[-4:]
+            return self.create_url(method, LOCALHOST + ":" + port_from_container_name)
+
+    def get_dcae_app_api_access_url(self, method, image_name, port):
+        return self.create_url(
+            method,
+            self.get_instance_address(image_name, port)
+        )
+
+    def get_instance_address(self, image_name, port):
+        if is_running_inside_docker():
+            return image_name + ":" + port
+        else:
+            logger.info("File `/.dockerenv` not found. Assuming local environment and using localhost.")
+            return LOCALHOST + ":" + port
+
+    def create_url(self, method, host_address):
+        return method + host_address
+
+def is_running_inside_docker():
+    return os.path.isfile("/.dockerenv")
+
+def copy_to_container(container_id, filepaths, path='/etc/ves-hv'):
+    with create_archive(filepaths) as archive:
+        docker.APIClient('unix:///var/run/docker.sock') \
+            .put_archive(container=container_id, path=(path), data=archive)
+
+
+def create_archive(filepaths):
+    tarstream = BytesIO()
+    tarfile = TarFile(fileobj=tarstream, mode='w')
+    for filepath in filepaths:
+        file = open(filepath, 'r')
+        file_data = file.read()
+
+        tarinfo = TarInfo(name=basename(file.name))
+        tarinfo.size = len(file_data)
+        tarinfo.mtime = time()
+
+        tarfile.addfile(tarinfo, BytesIO(file_data))
+
+    tarfile.close()
+    tarstream.seek(0)
+    return tarstream
diff --git a/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py
new file mode 100644
index 0000000..f6a9787
--- /dev/null
+++ b/tests/dcaegen2-collectors-hv-ves/testcases/libraries/XnfSimulatorLibrary.py
@@ -0,0 +1,166 @@
+import HttpRequests
+import os
+import docker
+from robot.api import logger
+from time import sleep
+
+XNF_SIMULATOR_NAME = "xNF Simulator"
+SIMULATOR_IMAGE_NAME = "onap/org.onap.dcaegen2.collectors.hv-ves.hv-collector-xnf-simulator"
+SIMULATOR_IMAGE_FULL_NAME = os.getenv("DOCKER_REGISTRY_PREFIX") + SIMULATOR_IMAGE_NAME + ":latest"
+WORKSPACE_ENV = os.getenv("WORKSPACE")
+certificates_dir_path = WORKSPACE_ENV + "/test/csit/plans/dcaegen2-collectors-hv-ves/testsuites/ssl/"
+collector_certs_lookup_dir = "/etc/ves-hv/"
+ONE_SECOND_IN_NANOS = 10 ** 9
+
+
+class XnfSimulatorLibrary:
+
+    def start_xnf_simulators(self, list_of_ports,
+                             should_use_valid_certs=True,
+                             should_disable_ssl=False,
+                             should_connect_to_unencrypted_hv_ves=False):
+        logger.info("Creating " + str(len(list_of_ports)) + " xNF Simulator containers")
+        dockerClient = docker.from_env()
+
+        self.pullImageIfAbsent(dockerClient)
+        logger.info("Using image: " + SIMULATOR_IMAGE_FULL_NAME)
+
+        simulators_addresses = self.create_containers(dockerClient,
+                                                      list_of_ports,
+                                                      should_use_valid_certs,
+                                                      should_disable_ssl,
+                                                      should_connect_to_unencrypted_hv_ves)
+
+        self.assert_containers_startup_was_successful(dockerClient)
+        dockerClient.close()
+        return simulators_addresses
+
+    def pullImageIfAbsent(self, dockerClient):
+        try:
+            dockerClient.images.get(SIMULATOR_IMAGE_FULL_NAME)
+        except:
+            logger.console("Image " + SIMULATOR_IMAGE_FULL_NAME + " will be pulled from repository. "
+                                                                  "This can take a while.")
+            dockerClient.images.pull(SIMULATOR_IMAGE_FULL_NAME)
+
+    def create_containers(self,
+                          dockerClient,
+                          list_of_ports,
+                          should_use_valid_certs,
+                          should_disable_ssl,
+                          should_connect_to_unencrypted_hv_ves):
+        simulators_addresses = []
+        for port in list_of_ports:
+            xnf = XnfSimulator(port, should_use_valid_certs, should_disable_ssl, should_connect_to_unencrypted_hv_ves)
+            container = self.run_simulator(dockerClient, xnf)
+            logger.info("Started container: " + container.name + "  " + container.id)
+            simulators_addresses.append(container.name + ":" + xnf.port)
+        return simulators_addresses
+
+    def run_simulator(self, dockerClient, xnf):
+        xNF_startup_command = xnf.get_startup_command()
+        xNF_healthcheck_command = xnf.get_healthcheck_command()
+        port = xnf.port
+        logger.info("Startup command: " + str(xNF_startup_command))
+        logger.info("Healthcheck command: " + str(xNF_healthcheck_command))
+        return dockerClient.containers.run(SIMULATOR_IMAGE_FULL_NAME,
+                                           command=xNF_startup_command,
+                                           healthcheck=xNF_healthcheck_command,
+                                           detach=True,
+                                           network="ves-hv-default",
+                                           ports={port + "/tcp": port},
+                                           volumes=self.container_volumes(),
+                                           name=xnf.container_name_prefix + port)
+
+    def container_volumes(self):
+        return {certificates_dir_path: {"bind": collector_certs_lookup_dir, "mode": 'rw'}}
+
+    def assert_containers_startup_was_successful(self, dockerClient):
+        checks_amount = 6
+        check_interval_in_seconds = 5
+        for _ in range(checks_amount):
+            sleep(check_interval_in_seconds)
+            all_containers_healthy = True
+            for container in self.get_simulators_list(dockerClient):
+                all_containers_healthy = all_containers_healthy and self.is_container_healthy(container)
+            if (all_containers_healthy):
+                return
+        raise ContainerException("One of xNF simulators containers did not pass the healthcheck.")
+
+    def is_container_healthy(self, container):
+        container_health = container.attrs['State']['Health']['Status']
+        return container_health == 'healthy' and container.status == 'running'
+
+    def stop_and_remove_all_xnf_simulators(self, suite_name):
+        dockerClient = docker.from_env()
+        for container in self.get_simulators_list(dockerClient):
+            logger.info("Stopping and removing container: " + container.id)
+            log_filename = WORKSPACE_ENV + "/archives/containers_logs/" + \
+                           suite_name.split(".")[-1] + "_" + container.name + ".log"
+            file = open(log_filename, "w+")
+            file.write(container.logs())
+            file.close()
+            container.stop()
+            container.remove()
+        dockerClient.close()
+
+    def get_simulators_list(self, dockerClient):
+        return dockerClient.containers.list(filters={"ancestor": SIMULATOR_IMAGE_FULL_NAME}, all=True)
+
+    def send_messages(self, simulator_url, message_filepath):
+        logger.info("Reading message to simulator from: " + message_filepath)
+
+        file = open(message_filepath, "rb")
+        data = file.read()
+        file.close()
+
+        logger.info("POST at: " + simulator_url)
+        resp = HttpRequests.session_without_env().post(simulator_url, data=data, timeout=5)
+        HttpRequests.checkStatusCode(resp.status_code, XNF_SIMULATOR_NAME)
+
+
+class XnfSimulator:
+    container_name_prefix = "ves-hv-collector-xnf-simulator"
+
+    def __init__(self,
+                 port,
+                 should_use_valid_certs,
+                 should_disable_ssl,
+                 should_connect_to_unencrypted_hv_ves):
+        self.port = port
+        cert_name_prefix = "" if should_use_valid_certs else "untrusted"
+        certificates_path_with_file_prefix = collector_certs_lookup_dir + cert_name_prefix
+        self.key_store_path = certificates_path_with_file_prefix + "client.p12"
+        self.trust_store_path = certificates_path_with_file_prefix + "trust.p12"
+        self.sec_store_passwd = "onaponap"
+        self.disable_ssl = should_disable_ssl
+        self.hv_collector_host = "unencrypted-ves-hv-collector" \
+            if should_connect_to_unencrypted_hv_ves else "ves-hv-collector"
+
+    def get_startup_command(self):
+        startup_command = ["--listen-port", self.port,
+                           "--ves-host", self.hv_collector_host,
+                           "--ves-port", "6061",
+                           "--key-store", self.key_store_path,
+                           "--trust-store", self.trust_store_path,
+                           "--key-store-password", self.sec_store_passwd,
+                           "--trust-store-password", self.sec_store_passwd
+                           ]
+        if self.disable_ssl:
+            startup_command.append("--ssl-disable")
+        return startup_command
+
+    def get_healthcheck_command(self):
+        return {
+            "interval": 5 * ONE_SECOND_IN_NANOS,
+            "timeout": 3 * ONE_SECOND_IN_NANOS,
+            "retries": 1,
+            "test": ["CMD", "curl", "--request", "GET",
+                     "--fail", "--silent", "--show-error",
+                     "localhost:" + self.port + "/healthcheck"]
+        }
+
+
+class ContainerException(Exception):
+    def __init__(self, message):
+        super(ContainerException, self).__init__(message)