summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/Dockerfile4
-rw-r--r--dovetail/__init__.py (renamed from scripts/__init__.py)0
-rw-r--r--dovetail/cert/basic.yml (renamed from scripts/cert/basic.yml)0
-rw-r--r--dovetail/conf/__init__.py (renamed from scripts/conf/__init__.py)0
-rw-r--r--dovetail/conf/dovetail_config.py (renamed from scripts/conf/dovetail_config.py)5
-rw-r--r--dovetail/conf/dovetail_config.yml (renamed from scripts/conf/dovetail_config.yml)0
-rw-r--r--dovetail/conf/functest_config.yml (renamed from scripts/conf/functest_config.yml)0
-rw-r--r--dovetail/conf/yardstick_config.yml29
-rw-r--r--dovetail/container.py (renamed from scripts/container.py)8
-rw-r--r--dovetail/parser.py (renamed from scripts/parser.py)0
-rw-r--r--dovetail/prepare_env.py (renamed from scripts/prepare_env.py)0
-rw-r--r--dovetail/report.py (renamed from scripts/report.py)32
-rwxr-xr-xdovetail/run.py (renamed from scripts/run.py)22
-rw-r--r--dovetail/testcase.py (renamed from scripts/testcase.py)0
-rw-r--r--dovetail/testcase/ipv6.tc001.yml (renamed from scripts/testcase/ipv6.tc001.yml)0
-rw-r--r--dovetail/utils/__init__.py (renamed from scripts/utils/__init__.py)0
-rw-r--r--dovetail/utils/dovetail_logger.py (renamed from scripts/utils/dovetail_logger.py)2
-rw-r--r--dovetail/utils/dovetail_utils.py (renamed from scripts/utils/dovetail_utils.py)0
-rw-r--r--ez_setup.py426
-rw-r--r--scripts/conf/yardstick_config.yml29
-rwxr-xr-xscripts/prepare_test_yard/build_flavor_image.sh146
-rwxr-xr-xscripts/prepare_test_yard/build_run_test.sh23
-rwxr-xr-xscripts/prepare_test_yard/run_test.sh20
-rwxr-xr-xscripts/prepare_test_yard/source_env.sh21
-rw-r--r--setup.py38
-rw-r--r--unittests/requirements.txt6
-rwxr-xr-xunittests/unittest.sh38
27 files changed, 574 insertions, 275 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index bdf5a40d..cc21203d 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -24,7 +24,7 @@ RUN \
jinja2
ENV HOME /home/opnfv
-ENV REPOS_DIR /home/opnfv/dovetail
+ENV REPOS_DIR ${HOME}/dovetail
WORKDIR /home/opnfv
RUN \
@@ -34,4 +34,4 @@ RUN \
&& \
mkdir -p ${REPOS_DIR}/results
-WORKDIR /home/opnfv/dovetail/scripts
+WORKDIR ${REPOS_DIR}/dovetail
diff --git a/scripts/__init__.py b/dovetail/__init__.py
index e69de29b..e69de29b 100644
--- a/scripts/__init__.py
+++ b/dovetail/__init__.py
diff --git a/scripts/cert/basic.yml b/dovetail/cert/basic.yml
index 25ebc7ae..25ebc7ae 100644
--- a/scripts/cert/basic.yml
+++ b/dovetail/cert/basic.yml
diff --git a/scripts/conf/__init__.py b/dovetail/conf/__init__.py
index e69de29b..e69de29b 100644
--- a/scripts/conf/__init__.py
+++ b/dovetail/conf/__init__.py
diff --git a/scripts/conf/dovetail_config.py b/dovetail/conf/dovetail_config.py
index e7942f52..f822d3ad 100644
--- a/scripts/conf/dovetail_config.py
+++ b/dovetail/conf/dovetail_config.py
@@ -14,11 +14,12 @@ SCENARIO_NAMING_FMT = 'certification_%s'
import yaml
import os
-with open(os.path.join(os.getcwd(),'conf','dovetail_config.yml')) as f:
+curr_path = os.path.dirname(os.path.abspath(__file__))
+with open(os.path.join(curr_path, 'dovetail_config.yml')) as f:
dovetail_config = yaml.safe_load(f)
for extra_config_file in dovetail_config['include_config']:
- with open(os.path.join(os.getcwd(),'conf',extra_config_file)) as f:
+ with open(os.path.join(curr_path, extra_config_file)) as f:
extra_config = yaml.safe_load(f)
dovetail_config.update(extra_config)
diff --git a/scripts/conf/dovetail_config.yml b/dovetail/conf/dovetail_config.yml
index 901988f8..901988f8 100644
--- a/scripts/conf/dovetail_config.yml
+++ b/dovetail/conf/dovetail_config.yml
diff --git a/scripts/conf/functest_config.yml b/dovetail/conf/functest_config.yml
index cd33dc59..cd33dc59 100644
--- a/scripts/conf/functest_config.yml
+++ b/dovetail/conf/functest_config.yml
diff --git a/dovetail/conf/yardstick_config.yml b/dovetail/conf/yardstick_config.yml
new file mode 100644
index 00000000..f7f05bcc
--- /dev/null
+++ b/dovetail/conf/yardstick_config.yml
@@ -0,0 +1,29 @@
+yardstick:
+ image_name: opnfv/yardstick
+ docker_tag: latest
+ envs: '-e INSTALLER_TYPE=compass -e INSTALLER_IP=192.168.200.2
+ -e NODE_NAME=dovetail-pod -e DEPLOY_SCENARIO=ha_nosdn
+ -e BUILD_TAG=dovetail -e CI_DEBUG=true -e DEPLOY_TYPE=baremetal
+ -e EXTERNAL_NETWORK=ext-net'
+ opts: '-id --privileged=true'
+ pre_condition:
+ cmds:
+ - 'source /home/opnfv/repos/yardstick/tests/ci/prepare_env.sh &&
+ source /home/opnfv/repos/yardstick/tests/ci/clean_images.sh && cleanup'
+ - 'source /home/opnfv/repos/yardstick/tests/ci/prepare_env.sh &&
+ cd /home/opnfv/repos/yardstick && source tests/ci/load_images.sh'
+ testcase:
+ cmds:
+ - 'mkdir -p /home/opnfv/yardstick/results/'
+ - 'cd /home/opnfv/repos/yardstick && source tests/ci/prepare_env.sh &&
+ yardstick task start tests/opnfv/test_cases/{{script_testcase}}.yaml
+ --output-file /home/opnfv/yardstick/results/{{script_testcase}}.out &>
+ /home/opnfv/yardstick/results/yardstick.log'
+ post_condition:
+ cmds:
+ - ''
+ result:
+ dir: '/home/opnfv/yardstick/results'
+ store_type: 'file'
+ file_path: 'yardstick.log'
+ db_url: 'http://testresults.opnfv.org/test/api/v1/results?case=%s&last=1'
diff --git a/scripts/container.py b/dovetail/container.py
index 3223c993..918edb33 100644
--- a/scripts/container.py
+++ b/dovetail/container.py
@@ -17,7 +17,6 @@ class Container:
container_list = {}
has_pull_latest_image = {'yardstick':False, 'functest':False}
- has_build_images = {'yardstick':False, 'functest':False}
def __init__(cls):
pass
@@ -68,10 +67,3 @@ class Container:
def exec_cmd(cls, container_id, sub_cmd, exit_on_error=False):
cmd = 'sudo docker exec %s /bin/bash -c "%s"' % (container_id, sub_cmd)
dt_utils.exec_cmd(cmd,logger,exit_on_error)
-
- @classmethod
- def copy_file(cls, file_dir, container_id, container_dir):
- for root, dirs, files in os.walk(file_dir):
- for file_name in files:
- cmd = 'sudo docker cp %s %s:%s' % (os.path.join(file_dir,file_name), container_id, container_dir)
- dt_utils.exec_cmd(cmd, logger, exit_on_error = False)
diff --git a/scripts/parser.py b/dovetail/parser.py
index 1c0c0450..1c0c0450 100644
--- a/scripts/parser.py
+++ b/dovetail/parser.py
diff --git a/scripts/prepare_env.py b/dovetail/prepare_env.py
index bd484302..bd484302 100644
--- a/scripts/prepare_env.py
+++ b/dovetail/prepare_env.py
diff --git a/scripts/report.py b/dovetail/report.py
index 42ec0df0..5dfa5890 100644
--- a/scripts/report.py
+++ b/dovetail/report.py
@@ -157,6 +157,30 @@ class YardstickCrawler:
self.type = 'yardstick'
def crawl(self, testcase=None):
+ store_type = dovetail_config[self.type]['result']['store_type']
+ if store_type == 'file':
+ return self.crawl_from_file(testcase)
+
+ if store_type == 'url':
+ return self.crawl_from_url(testcase)
+
+ def crawl_from_file(self, testcase=None):
+ file_path = os.path.join(dovetail_config['result_dir'], testcase+'.out')
+ if not os.path.exists(file_path):
+ logger.info('result file not found: %s' % file_path)
+ return None
+ try:
+ with open(file_path, 'r') as myfile:
+ output = myfile.read()
+ criteria = 'PASS'
+ json_results = {'criteria':criteria}
+ logger.debug('Results: %s' % str(json_results))
+ return json_results
+ except Exception as e:
+ logger.error('Cannot read content from the file: %s, exception: %s' % (file_path, e))
+ return None
+
+ def crawl_from_url(self, testcase=None):
return None
class CheckerFactory:
@@ -208,6 +232,8 @@ class FunctestChecker:
class YardstickChecker:
def check(cls, testcase, result):
- return 'PASS'
-
-
+ if not result:
+ testcase.passed(False)
+ else:
+ testcase.passed(result['criteria'] == 'PASS')
+ return
diff --git a/scripts/run.py b/dovetail/run.py
index 2afdfc7e..85871fab 100755
--- a/scripts/run.py
+++ b/dovetail/run.py
@@ -31,22 +31,6 @@ def load_scenario(scenario):
def load_testcase():
Testcase.load()
-def run_functest(testcase, container_id):
- for cmd in testcase.cmds:
- Container.exec_cmd(container_id, cmd)
-
-def run_yardstick(testcase, container_id):
- type = testcase.script_type()
- Container.copy_file(os.path.join(os.getcwd(), dovetail_config[type]['shell_dir_name']),\
- container_id, dovetail_config[type]['shell_dir'])
- if Container.has_build_images[type] == True:
- sub_cmd = dovetail_config[type]['testcase']['test_cmd'] % (testcase.script_testcase(), testcase.name())
- else:
- Container.has_build_images[type] = True
- sub_cmd = dovetail_config[type]['testcase']['build_test_cmd'] % (testcase.script_testcase(), testcase.name())
- Container.exec_cmd(container_id, sub_cmd)
- time.sleep(5)
-
def run_test(scenario):
for testcase_name in scenario['testcase_list']:
logger.info('>>[testcase]: %s' % (testcase_name))
@@ -74,10 +58,8 @@ def run_test(scenario):
if not testcase.prepare_cmd():
logger.error('failed to prepare testcase:%s' % testcase.name())
else:
- if testcase.script_type() == 'functest':
- run_functest(testcase, container_id)
- else:
- run_yardstick(testcase, container_id)
+ for cmd in testcase.cmds:
+ Container.exec_cmd(container_id, cmd)
#testcase.post_condition()
diff --git a/scripts/testcase.py b/dovetail/testcase.py
index 4deabe2e..4deabe2e 100644
--- a/scripts/testcase.py
+++ b/dovetail/testcase.py
diff --git a/scripts/testcase/ipv6.tc001.yml b/dovetail/testcase/ipv6.tc001.yml
index 9f11ac76..9f11ac76 100644
--- a/scripts/testcase/ipv6.tc001.yml
+++ b/dovetail/testcase/ipv6.tc001.yml
diff --git a/scripts/utils/__init__.py b/dovetail/utils/__init__.py
index e69de29b..e69de29b 100644
--- a/scripts/utils/__init__.py
+++ b/dovetail/utils/__init__.py
diff --git a/scripts/utils/dovetail_logger.py b/dovetail/utils/dovetail_logger.py
index 7335c0ae..9b20225c 100644
--- a/scripts/utils/dovetail_logger.py
+++ b/dovetail/utils/dovetail_logger.py
@@ -30,7 +30,7 @@ class Logger:
CI_DEBUG = os.getenv('CI_DEBUG')
self.logger = logging.getLogger(logger_name)
- self.logger.propagate = 0
+ self.logger.propagate = 0
self.logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
diff --git a/scripts/utils/dovetail_utils.py b/dovetail/utils/dovetail_utils.py
index 4c671552..4c671552 100644
--- a/scripts/utils/dovetail_utils.py
+++ b/dovetail/utils/dovetail_utils.py
diff --git a/ez_setup.py b/ez_setup.py
new file mode 100644
index 00000000..4ef3ee01
--- /dev/null
+++ b/ez_setup.py
@@ -0,0 +1,426 @@
+#!/usr/bin/env python
+
+"""
+Setuptools bootstrapping installer.
+
+Maintained at https://github.com/pypa/setuptools/tree/bootstrap.
+
+Run this script to install or upgrade setuptools.
+"""
+
+import os
+import shutil
+import sys
+import tempfile
+import zipfile
+import optparse
+import subprocess
+import platform
+import textwrap
+import contextlib
+import json
+import codecs
+
+from distutils import log
+
+try:
+ from urllib.request import urlopen
+ from urllib.parse import urljoin
+except ImportError:
+ from urllib2 import urlopen
+ from urlparse import urljoin
+
+try:
+ from site import USER_SITE
+except ImportError:
+ USER_SITE = None
+
+LATEST = object()
+DEFAULT_VERSION = LATEST
+DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/"
+DEFAULT_SAVE_DIR = os.curdir
+
+
+def _python_cmd(*args):
+ """
+ Execute a command.
+
+ Return True if the command succeeded.
+ """
+ args = (sys.executable,) + args
+ return subprocess.call(args) == 0
+
+
+def _install(archive_filename, install_args=()):
+ """Install Setuptools."""
+ with archive_context(archive_filename):
+ # installing
+ log.warn('Installing Setuptools')
+ if not _python_cmd('setup.py', 'install', *install_args):
+ log.warn('Something went wrong during the installation.')
+ log.warn('See the error message above.')
+ # exitcode will be 2
+ return 2
+
+
+def _build_egg(egg, archive_filename, to_dir):
+ """Build Setuptools egg."""
+ with archive_context(archive_filename):
+ # building an egg
+ log.warn('Building a Setuptools egg in %s', to_dir)
+ _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
+ # returning the result
+ log.warn(egg)
+ if not os.path.exists(egg):
+ raise IOError('Could not build the egg.')
+
+
+class ContextualZipFile(zipfile.ZipFile):
+
+ """Supplement ZipFile class to support context manager for Python 2.6."""
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.close()
+
+ def __new__(cls, *args, **kwargs):
+ """Construct a ZipFile or ContextualZipFile as appropriate."""
+ if hasattr(zipfile.ZipFile, '__exit__'):
+ return zipfile.ZipFile(*args, **kwargs)
+ return super(ContextualZipFile, cls).__new__(cls)
+
+
+@contextlib.contextmanager
+def archive_context(filename):
+ """
+ Unzip filename to a temporary directory, set to the cwd.
+
+ The unzipped target is cleaned up after.
+ """
+ tmpdir = tempfile.mkdtemp()
+ log.warn('Extracting in %s', tmpdir)
+ old_wd = os.getcwd()
+ try:
+ os.chdir(tmpdir)
+ with ContextualZipFile(filename) as archive:
+ archive.extractall()
+
+ # going in the directory
+ subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
+ os.chdir(subdir)
+ log.warn('Now working in %s', subdir)
+ yield
+
+ finally:
+ os.chdir(old_wd)
+ shutil.rmtree(tmpdir)
+
+
+def _do_download(version, download_base, to_dir, download_delay):
+ """Download Setuptools."""
+ py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys)
+ tp = 'setuptools-{version}-{py_desig}.egg'
+ egg = os.path.join(to_dir, tp.format(**locals()))
+ if not os.path.exists(egg):
+ archive = download_setuptools(version, download_base,
+ to_dir, download_delay)
+ _build_egg(egg, archive, to_dir)
+ sys.path.insert(0, egg)
+
+ # Remove previously-imported pkg_resources if present (see
+ # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details).
+ if 'pkg_resources' in sys.modules:
+ _unload_pkg_resources()
+
+ import setuptools
+ setuptools.bootstrap_install_from = egg
+
+
+def use_setuptools(
+ version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+ to_dir=DEFAULT_SAVE_DIR, download_delay=15):
+ """
+ Ensure that a setuptools version is installed.
+
+ Return None. Raise SystemExit if the requested version
+ or later cannot be installed.
+ """
+ version = _resolve_version(version)
+ to_dir = os.path.abspath(to_dir)
+
+ # prior to importing, capture the module state for
+ # representative modules.
+ rep_modules = 'pkg_resources', 'setuptools'
+ imported = set(sys.modules).intersection(rep_modules)
+
+ try:
+ import pkg_resources
+ pkg_resources.require("setuptools>=" + version)
+ # a suitable version is already installed
+ return
+ except ImportError:
+ # pkg_resources not available; setuptools is not installed; download
+ pass
+ except pkg_resources.DistributionNotFound:
+ # no version of setuptools was found; allow download
+ pass
+ except pkg_resources.VersionConflict as VC_err:
+ if imported:
+ _conflict_bail(VC_err, version)
+
+ # otherwise, unload pkg_resources to allow the downloaded version to
+ # take precedence.
+ del pkg_resources
+ _unload_pkg_resources()
+
+ return _do_download(version, download_base, to_dir, download_delay)
+
+
+def _conflict_bail(VC_err, version):
+ """
+ Setuptools was imported prior to invocation, so it is
+ unsafe to unload it. Bail out.
+ """
+ conflict_tmpl = textwrap.dedent("""
+ The required version of setuptools (>={version}) is not available,
+ and can't be installed while this script is running. Please
+ install a more recent version first, using
+ 'easy_install -U setuptools'.
+
+ (Currently using {VC_err.args[0]!r})
+ """)
+ msg = conflict_tmpl.format(**locals())
+ sys.stderr.write(msg)
+ sys.exit(2)
+
+
+def _unload_pkg_resources():
+ sys.meta_path = [
+ importer
+ for importer in sys.meta_path
+ if importer.__class__.__module__ != 'pkg_resources.extern'
+ ]
+ del_modules = [
+ name for name in sys.modules
+ if name.startswith('pkg_resources')
+ ]
+ for mod_name in del_modules:
+ del sys.modules[mod_name]
+
+
+def _clean_check(cmd, target):
+ """
+ Run the command to download target.
+
+ If the command fails, clean up before re-raising the error.
+ """
+ try:
+ subprocess.check_call(cmd)
+ except subprocess.CalledProcessError:
+ if os.access(target, os.F_OK):
+ os.unlink(target)
+ raise
+
+
+def download_file_powershell(url, target):
+ """
+ Download the file at url to target using Powershell.
+
+ Powershell will validate trust.
+ Raise an exception if the command cannot complete.
+ """
+ target = os.path.abspath(target)
+ ps_cmd = (
+ "[System.Net.WebRequest]::DefaultWebProxy.Credentials = "
+ "[System.Net.CredentialCache]::DefaultCredentials; "
+ '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")'
+ % locals()
+ )
+ cmd = [
+ 'powershell',
+ '-Command',
+ ps_cmd,
+ ]
+ _clean_check(cmd, target)
+
+
+def has_powershell():
+ """Determine if Powershell is available."""
+ if platform.system() != 'Windows':
+ return False
+ cmd = ['powershell', '-Command', 'echo test']
+ with open(os.path.devnull, 'wb') as devnull:
+ try:
+ subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
+ except Exception:
+ return False
+ return True
+download_file_powershell.viable = has_powershell
+
+
+def download_file_curl(url, target):
+ cmd = ['curl', url, '--location', '--silent', '--output', target]
+ _clean_check(cmd, target)
+
+
+def has_curl():
+ cmd = ['curl', '--version']
+ with open(os.path.devnull, 'wb') as devnull:
+ try:
+ subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
+ except Exception:
+ return False
+ return True
+download_file_curl.viable = has_curl
+
+
+def download_file_wget(url, target):
+ cmd = ['wget', url, '--quiet', '--output-document', target]
+ _clean_check(cmd, target)
+
+
+def has_wget():
+ cmd = ['wget', '--version']
+ with open(os.path.devnull, 'wb') as devnull:
+ try:
+ subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
+ except Exception:
+ return False
+ return True
+download_file_wget.viable = has_wget
+
+
+def download_file_insecure(url, target):
+ """Use Python to download the file, without connection authentication."""
+ src = urlopen(url)
+ try:
+ # Read all the data in one block.
+ data = src.read()
+ finally:
+ src.close()
+
+ # Write all the data in one block to avoid creating a partial file.
+ with open(target, "wb") as dst:
+ dst.write(data)
+download_file_insecure.viable = lambda: True
+
+
+def get_best_downloader():
+ downloaders = (
+ download_file_powershell,
+ download_file_curl,
+ download_file_wget,
+ download_file_insecure,
+ )
+ viable_downloaders = (dl for dl in downloaders if dl.viable())
+ return next(viable_downloaders, None)
+
+
+def download_setuptools(
+ version=DEFAULT_VERSION, download_base=DEFAULT_URL,
+ to_dir=DEFAULT_SAVE_DIR, delay=15,
+ downloader_factory=get_best_downloader):
+ """
+ Download setuptools from a specified location and return its filename.
+
+ `version` should be a valid setuptools version number that is available
+ as an sdist for download under the `download_base` URL (which should end
+ with a '/'). `to_dir` is the directory where the egg will be downloaded.
+ `delay` is the number of seconds to pause before an actual download
+ attempt.
+
+ ``downloader_factory`` should be a function taking no arguments and
+ returning a function for downloading a URL to a target.
+ """
+ version = _resolve_version(version)
+ # making sure we use the absolute path
+ to_dir = os.path.abspath(to_dir)
+ zip_name = "setuptools-%s.zip" % version
+ url = download_base + zip_name
+ saveto = os.path.join(to_dir, zip_name)
+ if not os.path.exists(saveto): # Avoid repeated downloads
+ log.warn("Downloading %s", url)
+ downloader = downloader_factory()
+ downloader(url, saveto)
+ return os.path.realpath(saveto)
+
+
+def _resolve_version(version):
+ """
+ Resolve LATEST version
+ """
+ if version is not LATEST:
+ return version
+
+ meta_url = urljoin(DEFAULT_URL, '/pypi/setuptools/json')
+ resp = urlopen(meta_url)
+ with contextlib.closing(resp):
+ try:
+ charset = resp.info().get_content_charset()
+ except Exception:
+ # Python 2 compat; assume UTF-8
+ charset = 'UTF-8'
+ reader = codecs.getreader(charset)
+ doc = json.load(reader(resp))
+
+ return str(doc['info']['version'])
+
+
+def _build_install_args(options):
+ """
+ Build the arguments to 'python setup.py install' on the setuptools package.
+
+ Returns list of command line arguments.
+ """
+ return ['--user'] if options.user_install else []
+
+
+def _parse_args():
+ """Parse the command line for options."""
+ parser = optparse.OptionParser()
+ parser.add_option(
+ '--user', dest='user_install', action='store_true', default=False,
+ help='install in user site package')
+ parser.add_option(
+ '--download-base', dest='download_base', metavar="URL",
+ default=DEFAULT_URL,
+ help='alternative URL from where to download the setuptools package')
+ parser.add_option(
+ '--insecure', dest='downloader_factory', action='store_const',
+ const=lambda: download_file_insecure, default=get_best_downloader,
+ help='Use internal, non-validating downloader'
+ )
+ parser.add_option(
+ '--version', help="Specify which version to download",
+ default=DEFAULT_VERSION,
+ )
+ parser.add_option(
+ '--to-dir',
+ help="Directory to save (and re-use) package",
+ default=DEFAULT_SAVE_DIR,
+ )
+ options, args = parser.parse_args()
+ # positional arguments are ignored
+ return options
+
+
+def _download_args(options):
+ """Return args for download_setuptools function from cmdline args."""
+ return dict(
+ version=options.version,
+ download_base=options.download_base,
+ downloader_factory=options.downloader_factory,
+ to_dir=options.to_dir,
+ )
+
+
+def main():
+ """Install or upgrade setuptools and EasyInstall."""
+ options = _parse_args()
+ archive = download_setuptools(**_download_args(options))
+ return _install(archive, _build_install_args(options))
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/scripts/conf/yardstick_config.yml b/scripts/conf/yardstick_config.yml
deleted file mode 100644
index 7a40dc70..00000000
--- a/scripts/conf/yardstick_config.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-yardstick:
- image_name: opnfv/yardstick
- docker_tag: stable
- envs: '-e INSTALLER_TYPE=compass -e INSTALLER_IP=192.168.200.2
- -e NODE_NAME=dovetail-pod -e DEPLOY_SCENARIO=ha_nosdn
- -e BUILD_TAG=dovetail -e CI_DEBUG=true -e DEPLOY_TYPE=baremetal
- -e EXTERNAL_NETWORK=ext-net'
- opts: '-id --privileged=true'
- result_dir: '/tmp/yardstick/result'
- shell_dir: '/tmp/yardstick'
- shell_dir_name: 'prepare_test_yard'
- pre_condition:
- cmds:
- - 'echo test for precondition'
- testcase:
- build_test_cmd: '/tmp/yardstick/build_run_test.sh %s.yaml /tmp/yardstick/result/%s.out'
- test_cmd: '/tmp/yardstick/run_test.sh %s.yaml /tmp/yardstick/result/%s.out'
- cmds:
- - '/tmp/yardstick/build_run_test.sh {{script_testcase}}.yaml /tmp/yardstick/result/{{testcase}}.out'
- - '/tmp/yardstick/run_test.sh {{script_testcase}}.yaml /tmp/yardstick/result/{{testcase}}.out'
- post_condition:
- cmds:
- - ''
- result:
- dir: '/tmp/yardstick/result'
- store_type: 'file'
- db_url: 'http://testresults.opnfv.org/test/api/v1/results?case=%s&last=1'
- file_path: '/home/opnfv/dovetail/results/yardstick.log'
-
diff --git a/scripts/prepare_test_yard/build_flavor_image.sh b/scripts/prepare_test_yard/build_flavor_image.sh
deleted file mode 100755
index 0802f08d..00000000
--- a/scripts/prepare_test_yard/build_flavor_image.sh
+++ /dev/null
@@ -1,146 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-set -e
-
-cleanup()
-{
- echo
- echo "========== Cleanup =========="
-
- if ! glance image-list; then
- return
- fi
-
- for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server -e Ubuntu-14.04 \
- -e yardstick-vivid-kernel | awk '{print $2}'); do
- echo "Deleting image $image..."
- glance image-delete $image || true
- done
-
- nova flavor-delete yardstick-flavor &> /dev/null || true
-}
-
-create_nova_flavor()
-{
- if ! nova flavor-list | grep -q yardstick-flavor; then
- echo
- echo "========== Create nova flavor =========="
- # Create the nova flavor used by some sample test cases
- nova flavor-create yardstick-flavor 100 512 3 1
- # DPDK-enabled OVS requires guest memory to be backed by large pages
- if [[ "$DEPLOY_SCENARIO" == *"-ovs-"* ]]; then
- nova flavor-key yardstick-flavor set hw:mem_page_size=large
- fi
- fi
-}
-
-load_cirros_image()
-{
- echo
- echo "========== Loading cirros cloud image =========="
-
- local image_file=/home/opnfv/images/cirros-0.3.3-x86_64-disk.img
-
- output=$(glance image-create \
- --name cirros-0.3.3 \
- --disk-format qcow2 \
- --container-format bare \
- --file $image_file)
- echo "$output"
-
- CIRROS_IMAGE_ID=$(echo "$output" | grep " id " | awk '{print $(NF-1)}')
- if [ -z "$CIRROS_IMAGE_ID" ]; then
- echo 'Failed uploading cirros image to cloud'.
- exit 1
- fi
-
- echo "Cirros image id: $CIRROS_IMAGE_ID"
-}
-
-load_ubuntu_image()
-{
- echo
- echo "========== Loading ubuntu cloud image =========="
-
- local ubuntu_image_file=/home/opnfv/images/trusty-server-cloudimg-amd64-disk1.img
-
- output=$(glance image-create \
- --name Ubuntu-14.04 \
- --disk-format qcow2 \
- --container-format bare \
- --file $ubuntu_image_file)
- echo "$output"
-
- UBUNTU_IMAGE_ID=$(echo "$output" | grep " id " | awk '{print $(NF-1)}')
-
- if [ -z "$UBUNTU_IMAGE_ID" ]; then
- echo 'Failed uploading UBUNTU image to cloud'.
- exit 1
- fi
-
- echo "Ubuntu image id: $UBUNTU_IMAGE_ID"
-}
-
-QCOW_IMAGE="/tmp/workspace/yardstick/yardstick-trusty-server.img"
-
-build_yardstick_image()
-{
- echo
- echo "========== Build yardstick cloud image =========="
-
- export YARD_IMG_ARCH="amd64"
- sudo echo "Defaults env_keep += \"YARD_IMG_ARCH\"" >> /etc/sudoers
- local cmd="sudo $(which yardstick-img-modify) $(pwd)/tools/ubuntu-server-cloudimg-modify.sh"
-
- # Build the image. Retry once if the build fails.
- $cmd || $cmd
-
- if [ ! -f $QCOW_IMAGE ]; then
- echo "Failed building QCOW image"
- exit 1
- fi
-}
-
-load_yardstick_image()
-{
- echo
- echo "========== Loading yardstick cloud image =========="
-
- output=$(glance --os-image-api-version 1 image-create \
- --name yardstick-trusty-server \
- --is-public true --disk-format qcow2 \
- --container-format bare \
- --file $QCOW_IMAGE)
- echo "$output"
-
- GLANCE_IMAGE_ID=$(echo "$output" | grep " id " | awk '{print $(NF-1)}')
-
- if [ -z "$GLANCE_IMAGE_ID" ]; then
- echo 'Failed uploading image to cloud'.
- exit 1
- fi
-
- sudo rm -f $QCOW_IMAGE
-
- echo "Glance image id: $GLANCE_IMAGE_ID"
-}
-
-main()
-{
- cleanup
- create_nova_flavor
- load_cirros_image
- load_ubuntu_image
- build_yardstick_image
- load_yardstick_image
-}
-
-main
diff --git a/scripts/prepare_test_yard/build_run_test.sh b/scripts/prepare_test_yard/build_run_test.sh
deleted file mode 100755
index 91ac589e..00000000
--- a/scripts/prepare_test_yard/build_run_test.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-set -e
-
-cd /home/opnfv/repos/yardstick
-
-source /tmp/yardstick/source_env.sh
-
-echo "========== Build the flavor and load images =========="
-source /tmp/yardstick/build_flavor_image.sh
-
-echo "========== Run yardstick testcase =========="
-cmd="yardstick task start /home/opnfv/repos/yardstick/tests/opnfv/test_cases/$1 \
- --output-file $2"
-${cmd}
diff --git a/scripts/prepare_test_yard/run_test.sh b/scripts/prepare_test_yard/run_test.sh
deleted file mode 100755
index 326c637b..00000000
--- a/scripts/prepare_test_yard/run_test.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-set -e
-
-cd /home/opnfv/repos/yardstick
-
-source /tmp/yardstick/source_env.sh
-
-echo "========== Run yardstick testcase =========="
-cmd="yardstick task start /home/opnfv/repos/yardstick/tests/opnfv/test_cases/$1 \
- --output-file $2"
-${cmd}
diff --git a/scripts/prepare_test_yard/source_env.sh b/scripts/prepare_test_yard/source_env.sh
deleted file mode 100755
index 80135d70..00000000
--- a/scripts/prepare_test_yard/source_env.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-##############################################################################
-# Copyright (c) 2016 HUAWEI TECHNOLOGIES CO.,LTD and others.
-
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-set -e
-
-: ${YARDSTICK_REPO:='https://gerrit.opnfv.org/gerrit/yardstick'}
-: ${YARDSTICK_REPO_DIR:='/home/opnfv/repos/yardstick'}
-: ${YARDSTICK_BRANCH:='master'} # branch, tag, sha1 or refspec
-
-: ${RELENG_REPO:='https://gerrit.opnfv.org/gerrit/releng'}
-: ${RELENG_REPO_DIR:='/home/opnfv/repos/releng'}
-: ${RELENG_BRANCH:='master'} # branch, tag, sha1 or refspec
-
-source $YARDSTICK_REPO_DIR/tests/ci/prepare_env.sh
diff --git a/setup.py b/setup.py
new file mode 100644
index 00000000..40dc4751
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,38 @@
+##############################################################################
+# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+from setuptools import setup, find_packages
+
+
+setup(
+ name="dovetail",
+ version="0.dev0",
+ packages=find_packages(),
+ include_package_data=True,
+ package_data={
+ 'dovetail': [
+ '*.py',
+ 'conf/*.py',
+ 'conf/*.yml',
+ 'utils/*.py',
+ ]
+ },
+ url="https://www.opnfv.org",
+ install_requires=["coverage>=3.6",
+ "flake8",
+ "Jinja2>=2.6",
+ "PyYAML>=3.10",
+ "Click"
+ ],
+ entry_points={
+ 'console_scripts': [
+ 'dovetail=dovetail.main:main',
+ ],
+ }
+)
diff --git a/unittests/requirements.txt b/unittests/requirements.txt
new file mode 100644
index 00000000..694a62b4
--- /dev/null
+++ b/unittests/requirements.txt
@@ -0,0 +1,6 @@
+Click
+coverage==4.1b2
+flake8==2.5.4
+Jinja2==2.8
+PyYAML==3.11
+
diff --git a/unittests/unittest.sh b/unittests/unittest.sh
new file mode 100755
index 00000000..1560a90d
--- /dev/null
+++ b/unittests/unittest.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+##############################################################################
+# Copyright (c) 2016 OPNFV and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# Run flake8
+# Future, more can be added when necessary, such as coverage/functional/unit check
+# of the dovetail tool
+
+getopts ":f" FILE_OPTION
+
+run_flake8() {
+ echo "Running flake8 ... "
+ logfile=unittest_results.log
+ if [ $FILE_OPTION == "f" ]; then
+ flake8 dovetail > $logfile
+ else
+ flake8 dovetail
+ fi
+
+ if [ $? -ne 0 ]; then
+ echo "FAILED"
+ if [ $FILE_OPTION == "f" ]; then
+ echo "Results in $logfile"
+ fi
+ exit 1
+ else
+ echo "OK"
+ fi
+}
+
+run_flake8