RIFT OSM R1 Initial Submission
[osm/SO.git] / rwlaunchpad / ra / pytest / ns / conftest.py
diff --git a/rwlaunchpad/ra/pytest/ns/conftest.py b/rwlaunchpad/ra/pytest/ns/conftest.py
new file mode 100644 (file)
index 0000000..a1fa446
--- /dev/null
@@ -0,0 +1,292 @@
+
+# 
+#   Copyright 2016 RIFT.IO 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 functools
+import hashlib
+import pytest
+import os
+import tempfile
+import shutil
+import subprocess
+
+import gi
+import rift.auto.session
+import rift.mano.examples.ping_pong_nsd as ping_pong
+import rift.vcs.vcs
+
+class PackageError(Exception):
+    pass
+
+@pytest.fixture(scope='session', autouse=True)
+def cloud_account_name(request):
+    '''fixture which returns the name used to identify the cloud account'''
+    return 'cloud-0'
+
+@pytest.fixture(scope='session')
+def ping_pong_install_dir():
+    '''Fixture containing the location of ping_pong installation
+    '''
+    install_dir = os.path.join(
+        os.environ["RIFT_ROOT"],
+        "images"
+        )
+    return install_dir
+
+@pytest.fixture(scope='session')
+def ping_vnfd_package_file(ping_pong_install_dir):
+    '''Fixture containing the location of the ping vnfd package
+
+    Arguments:
+        ping_pong_install_dir - location of ping_pong installation
+    '''
+    ping_pkg_file = os.path.join(
+            ping_pong_install_dir,
+            "ping_vnfd_with_image.tar.gz",
+            )
+    if not os.path.exists(ping_pkg_file):
+        raise_package_error()
+
+    return ping_pkg_file
+
+
+@pytest.fixture(scope='session')
+def pong_vnfd_package_file(ping_pong_install_dir):
+    '''Fixture containing the location of the pong vnfd package
+
+    Arguments:
+        ping_pong_install_dir - location of ping_pong installation
+    '''
+    pong_pkg_file = os.path.join(
+            ping_pong_install_dir,
+            "pong_vnfd_with_image.tar.gz",
+            )
+    if not os.path.exists(pong_pkg_file):
+        raise_package_error()
+
+    return pong_pkg_file
+
+
+@pytest.fixture(scope='session')
+def ping_pong_nsd_package_file(ping_pong_install_dir):
+    '''Fixture containing the location of the ping_pong_nsd package
+
+    Arguments:
+        ping_pong_install_dir - location of ping_pong installation
+    '''
+    ping_pong_pkg_file = os.path.join(
+            ping_pong_install_dir,
+            "ping_pong_nsd.tar.gz",
+            )
+    if not os.path.exists(ping_pong_pkg_file):
+        raise_package_error()
+
+    return ping_pong_pkg_file
+
+@pytest.fixture(scope='session')
+def image_dirs():
+    ''' Fixture containing a list of directories where images can be found
+    '''
+    rift_build = os.environ['RIFT_BUILD']
+    rift_root = os.environ['RIFT_ROOT']
+    image_dirs = [
+        os.path.join(
+            rift_build,
+            "modules/core/mano/src/core_mano-build/examples/",
+            "ping_pong_ns/ping_vnfd_with_image/images"
+        ),
+        os.path.join(
+            rift_root,
+            "images"
+        )
+    ]
+    return image_dirs
+
+@pytest.fixture(scope='session')
+def image_paths(image_dirs):
+    ''' Fixture containing a mapping of image names to their path images
+
+    Arguments:
+        image_dirs - a list of directories where images are located
+    '''
+    image_paths = {}
+    for image_dir in image_dirs:
+        if os.path.exists(image_dir):
+            names = os.listdir(image_dir)
+            image_paths.update({name:os.path.join(image_dir, name) for name in names})
+    return image_paths
+
+@pytest.fixture(scope='session')
+def path_ping_image(image_paths):
+    ''' Fixture containing the location of the ping image
+
+    Arguments:
+        image_paths - mapping of images to their paths
+    '''
+    return image_paths["Fedora-x86_64-20-20131211.1-sda-ping.qcow2"]
+
+@pytest.fixture(scope='session')
+def path_pong_image(image_paths):
+    ''' Fixture containing the location of the pong image
+
+    Arguments:
+        image_paths - mapping of images to their paths
+    '''
+    return image_paths["Fedora-x86_64-20-20131211.1-sda-pong.qcow2"]
+
+class PingPongFactory:
+    def __init__(self, path_ping_image, path_pong_image, rsyslog_host, rsyslog_port):
+        self.path_ping_image = path_ping_image
+        self.path_pong_image = path_pong_image
+        self.rsyslog_host = rsyslog_host
+        self.rsyslog_port = rsyslog_port
+
+    def generate_descriptors(self):
+        '''Return a new set of ping and pong descriptors
+        '''
+        def md5sum(path):
+            with open(path, mode='rb') as fd:
+                md5 = hashlib.md5()
+                for buf in iter(functools.partial(fd.read, 4096), b''):
+                    md5.update(buf)
+            return md5.hexdigest()
+
+        ping_md5sum = md5sum(self.path_ping_image)
+        pong_md5sum = md5sum(self.path_pong_image)
+
+        ex_userdata = None
+        if self.rsyslog_host and self.rsyslog_port:
+            ex_userdata = '''
+rsyslog:
+  - "$ActionForwardDefaultTemplate RSYSLOG_ForwardFormat"
+  - "*.* @{host}:{port}"
+            '''.format(
+                host=self.rsyslog_host,
+                port=self.rsyslog_port,
+            )
+
+        descriptors = ping_pong.generate_ping_pong_descriptors(
+                pingcount=1,
+                ping_md5sum=ping_md5sum,
+                pong_md5sum=pong_md5sum,
+                ex_ping_userdata=ex_userdata,
+                ex_pong_userdata=ex_userdata,
+        )
+
+        return descriptors
+
+@pytest.fixture(scope='session')
+def ping_pong_factory(path_ping_image, path_pong_image, rsyslog_host, rsyslog_port):
+    '''Fixture returns a factory capable of generating ping and pong descriptors
+    '''
+    return PingPongFactory(path_ping_image, path_pong_image, rsyslog_host, rsyslog_port)
+
+@pytest.fixture(scope='session')
+def ping_pong_records(ping_pong_factory):
+    '''Fixture returns the default set of ping_pong descriptors
+    '''
+    return ping_pong_factory.generate_descriptors()
+
+
+@pytest.fixture(scope='session')
+def descriptors(request, ping_pong_records):
+    def pingpong_descriptors(with_images=True):
+        """Generated the VNFDs & NSD files for pingpong NS.
+
+        Returns:
+            Tuple: file path for ping vnfd, pong vnfd and ping_pong_nsd
+        """
+        ping_vnfd, pong_vnfd, ping_pong_nsd = ping_pong_records
+
+        tmpdir = tempfile.mkdtemp()
+        rift_build = os.environ['RIFT_BUILD']
+        MANO_DIR = os.path.join(
+                rift_build,
+                "modules/core/mano/src/core_mano-build/examples/ping_pong_ns")
+        ping_img = os.path.join(MANO_DIR, "ping_vnfd_with_image/images/Fedora-x86_64-20-20131211.1-sda-ping.qcow2")
+        pong_img = os.path.join(MANO_DIR, "pong_vnfd_with_image/images/Fedora-x86_64-20-20131211.1-sda-pong.qcow2")
+
+        """ grab cached copies of these files if not found. They may not exist 
+            because our git submodule dependency mgmt
+            will not populate these because they live in .build, not .install
+        """
+        if not os.path.exists(ping_img):
+            ping_img = os.path.join(
+                        os.environ['RIFT_ROOT'], 
+                        'images/Fedora-x86_64-20-20131211.1-sda-ping.qcow2')
+            pong_img = os.path.join(
+                        os.environ['RIFT_ROOT'], 
+                        'images/Fedora-x86_64-20-20131211.1-sda-pong.qcow2')
+
+        for descriptor in [ping_vnfd, pong_vnfd, ping_pong_nsd]:
+            descriptor.write_to_file(output_format='xml', outdir=tmpdir)
+
+        ping_img_path = os.path.join(tmpdir, "{}/images/".format(ping_vnfd.name))
+        pong_img_path = os.path.join(tmpdir, "{}/images/".format(pong_vnfd.name))
+
+        if with_images:
+            os.makedirs(ping_img_path)
+            os.makedirs(pong_img_path)
+            shutil.copy(ping_img, ping_img_path)
+            shutil.copy(pong_img, pong_img_path)
+
+        for dir_name in [ping_vnfd.name, pong_vnfd.name, ping_pong_nsd.name]:
+            subprocess.call([
+                    "sh",
+                    "{rift_install}/usr/rift/toolchain/cmake/bin/generate_descriptor_pkg.sh".format(rift_install=os.environ['RIFT_INSTALL']),
+                    tmpdir,
+                    dir_name])
+
+        return (os.path.join(tmpdir, "{}.tar.gz".format(ping_vnfd.name)),
+                os.path.join(tmpdir, "{}.tar.gz".format(pong_vnfd.name)),
+                os.path.join(tmpdir, "{}.tar.gz".format(ping_pong_nsd.name)))
+
+    def haproxy_descriptors():
+        """HAProxy descriptors."""
+        files = [
+            os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/http_client/http_client_vnfd.tar.gz"),
+            os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/httpd/httpd_vnfd.tar.gz"),
+            os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/haproxy/haproxy_vnfd.tar.gz"),
+            os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/waf/waf_vnfd.tar.gz"),
+            os.path.join(os.getenv('RIFT_BUILD'), "modules/ext/vnfs/src/ext_vnfs-build/haproxy_waf_httpd_nsd/haproxy_waf_httpd_nsd.tar.gz")
+            ]
+
+        return files
+
+    if request.config.option.network_service == "pingpong":
+        return pingpong_descriptors()
+    elif request.config.option.network_service == "pingpong_noimg":
+        return pingpong_descriptors(with_images=False)
+    elif request.config.option.network_service == "haproxy":
+        return haproxy_descriptors()
+
+
+@pytest.fixture(scope='session')
+def descriptor_images(request):
+    def haproxy_images():
+        """HAProxy images."""
+        images = [
+            os.path.join(os.getenv('RIFT_ROOT'), "images/haproxy-v03.qcow2"),
+            os.path.join(os.getenv('RIFT_ROOT'), "images/web-app-firewall-v02.qcow2"),
+            os.path.join(os.getenv('RIFT_ROOT'), "images/web-server-v02.qcow2")
+            ]
+
+        return images
+
+    if request.config.option.network_service == "haproxy":
+        return haproxy_images()
+
+    return []