Merge "Remove skip for bug #984762"
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..fceadba
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# Copyright (c) 2012 OpenStack, LLC.
+#
+# 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 setuptools
+
+setuptools.setup(
+ name='tempest',
+ version="0.1",
+ description='The OpenStack Integration Test Suite',
+ license='Apache License (2.0)',
+ author='OpenStack',
+ author_email='openstack@lists.launchpad.net',
+ url='http://github.com/openstack/tempest/',
+ classifiers=[
+ 'Development Status :: 4 - Beta',
+ 'License :: OSI Approved :: Apache Software License',
+ 'Operating System :: POSIX :: Linux',
+ 'Programming Language :: Python :: 2.6',
+ 'Environment :: No Input/Output (Daemon)',
+ ],
+ py_modules=[])
diff --git a/tempest/config.py b/tempest/config.py
index ce79044..4906c4c 100644
--- a/tempest/config.py
+++ b/tempest/config.py
@@ -33,7 +33,7 @@
def get(self, item_name, default_value=None):
try:
- return self.conf.get(self.SECTION_NAME, item_name)
+ return self.conf.get(self.SECTION_NAME, item_name, raw=True)
except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
return default_value
diff --git a/tempest/services/nova/json/servers_client.py b/tempest/services/nova/json/servers_client.py
index 031259f..b4ea973 100644
--- a/tempest/services/nova/json/servers_client.py
+++ b/tempest/services/nova/json/servers_client.py
@@ -147,8 +147,8 @@
timed_out = int(time.time()) - start >= self.build_timeout
if server_status != status and timed_out:
- message = 'Server %s failed to reach %s status within the \
- required time (%s s).' % (server_id, status,
+ message = 'Server %s failed to reach %s status within the '\
+ 'required time (%s s).' % (server_id, status,
self.build_timeout)
message += ' Current status: %s.' % server_status
raise exceptions.TimeoutException(message)
diff --git a/tempest/tests/compute/test_console_output.py b/tempest/tests/compute/test_console_output.py
index b59b30d..8af7467 100644
--- a/tempest/tests/compute/test_console_output.py
+++ b/tempest/tests/compute/test_console_output.py
@@ -45,6 +45,10 @@
@attr(type='positive')
def test_get_console_output(self):
+ """
+ Positive test:Should be able to GET the console output
+ for a given server_id and number of lines
+ """
def get_output():
resp, output = self.client.get_console_output(self.server_id, 10)
self.assertEqual(200, resp.status)
@@ -55,6 +59,10 @@
@attr(type='negative')
def test_get_console_output_invalid_server_id(self):
+ """
+ Negative test: Should not be able to get the console output
+ for an invalid server_id
+ """
try:
resp, output = self.client.get_console_output('!@#$%^&*()', 10)
except exceptions.NotFound:
@@ -63,6 +71,10 @@
@attr(type='positive')
@unittest.skip('Until tempest bug 1014683 is fixed.')
def test_get_console_output_server_id_in_reboot_status(self):
+ """
+ Positive test:Should be able to GET the console output
+ for a given server_id in reboot status
+ """
try:
resp, output = self.servers_client.reboot(self.server_id, 'SOFT')
self.servers_client.wait_for_server_status(self.server_id,
diff --git a/tempest/tests/compute/test_floating_ips_actions.py b/tempest/tests/compute/test_floating_ips_actions.py
index ca950c2..afd0a3f 100644
--- a/tempest/tests/compute/test_floating_ips_actions.py
+++ b/tempest/tests/compute/test_floating_ips_actions.py
@@ -165,7 +165,7 @@
self.fail('Should not be able to dissociate'
' a nonexistant floating IP')
- @unittest.skip("Skipped until the Bug #1000571 is resolved")
+ @unittest.skip("Skipped until the Bug #1029911 is resolved")
@attr(type='negative')
def test_associate_already_associated_floating_ip(self):
"""
diff --git a/tempest/tests/compute/test_list_server_filters.py b/tempest/tests/compute/test_list_server_filters.py
index 23f0f94..e74f85e 100644
--- a/tempest/tests/compute/test_list_server_filters.py
+++ b/tempest/tests/compute/test_list_server_filters.py
@@ -87,6 +87,10 @@
cls.client.delete_server(cls.s3['id'])
super(ListServerFiltersTest, cls).tearDownClass()
+ def _server_id_in_results(self, server_id, results):
+ ids = [row['id'] for row in results]
+ return server_id in ids
+
@utils.skip_unless_attr('multiple_images', 'Only one image found')
@attr(type='positive')
def test_list_servers_filter_by_image(self):
@@ -95,9 +99,9 @@
resp, body = self.client.list_servers(params)
servers = body['servers']
- self.assertTrue(self.s1_min in servers)
- self.assertTrue(self.s2_min not in servers)
- self.assertTrue(self.s3_min in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_filter_by_flavor(self):
@@ -106,9 +110,9 @@
resp, body = self.client.list_servers(params)
servers = body['servers']
- self.assertTrue(self.s1_min not in servers)
- self.assertTrue(self.s2_min not in servers)
- self.assertTrue(self.s3_min in servers)
+ self.assertFalse(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_filter_by_server_name(self):
@@ -117,9 +121,9 @@
resp, body = self.client.list_servers(params)
servers = body['servers']
- self.assertTrue(self.s1_min in servers)
- self.assertTrue(self.s2_min not in servers)
- self.assertTrue(self.s3_min not in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_filter_by_server_status(self):
@@ -128,9 +132,9 @@
resp, body = self.client.list_servers(params)
servers = body['servers']
- self.assertTrue(self.s1_min in servers)
- self.assertTrue(self.s2_min in servers)
- self.assertTrue(self.s3_min in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_limit_results(self):
@@ -147,9 +151,9 @@
resp, body = self.client.list_servers_with_detail(params)
servers = body['servers']
- self.assertTrue(self.s1 in servers)
- self.assertTrue(self.s2 not in servers)
- self.assertTrue(self.s3 in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_detailed_filter_by_flavor(self):
@@ -158,9 +162,9 @@
resp, body = self.client.list_servers_with_detail(params)
servers = body['servers']
- self.assertTrue(self.s1 not in servers)
- self.assertTrue(self.s2 not in servers)
- self.assertTrue(self.s3 in servers)
+ self.assertFalse(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_detailed_filter_by_server_name(self):
@@ -169,9 +173,9 @@
resp, body = self.client.list_servers_with_detail(params)
servers = body['servers']
- self.assertTrue(self.s1 in servers)
- self.assertTrue(self.s2 not in servers)
- self.assertTrue(self.s3 not in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s2['id'], servers))
+ self.assertFalse(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_detailed_filter_by_server_status(self):
@@ -180,9 +184,9 @@
resp, body = self.client.list_servers_with_detail(params)
servers = body['servers']
- self.assertTrue(self.s1 in servers)
- self.assertTrue(self.s2 in servers)
- self.assertTrue(self.s3 in servers)
+ self.assertTrue(self._server_id_in_results(self.s1['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s2['id'], servers))
+ self.assertTrue(self._server_id_in_results(self.s3['id'], servers))
@attr(type='positive')
def test_list_servers_detailed_limit_results(self):
diff --git a/tempest/tests/compute/test_servers_negative.py b/tempest/tests/compute/test_servers_negative.py
index d64f103..5d7742b 100644
--- a/tempest/tests/compute/test_servers_negative.py
+++ b/tempest/tests/compute/test_servers_negative.py
@@ -247,12 +247,13 @@
@attr(type='negative')
def test_delete_a_server_of_another_tenant(self):
"""Delete a server that belongs to another tenant"""
-
- server = self.create_server()
- resp, body = self.client.delete_server(server['id'])
- self.assertEqual(resp['status'], '204')
- self.assertRaises(exceptions.NotFound, self.alt_client.delete_server,
- server['id'])
+ try:
+ server = self.create_server()
+ self.assertRaises(exceptions.NotFound,
+ self.alt_client.delete_server,
+ server['id'])
+ finally:
+ self.client.delete_server(server['id'])
@attr(type='negative')
def test_delete_server_pass_negative_id(self):
diff --git a/tempest/tests/compute/test_volumes_negative.py b/tempest/tests/compute/test_volumes_negative.py
index cacea93..8d67fff 100644
--- a/tempest/tests/compute/test_volumes_negative.py
+++ b/tempest/tests/compute/test_volumes_negative.py
@@ -72,7 +72,6 @@
else:
self.fail('Should not be able to DELETE a nonexistant volume')
- @unittest.skip('Until bug 1006857 is fixed.')
@raises(exceptions.BadRequest)
@attr(type='negative')
def test_create_volume_with_invalid_size(self):
@@ -86,7 +85,6 @@
display_name=v_name,
metadata=metadata)
- @unittest.skip('Until bug 1006857 is fixed.')
@raises(exceptions.BadRequest)
@attr(type='negative')
def test_create_volume_with_out_passing_size(self):
@@ -100,7 +98,6 @@
display_name=v_name,
metadata=metadata)
- @unittest.skip('Until bug 1006875 is fixed.')
@raises(exceptions.BadRequest)
@attr(type='negative')
def test_create_volume_with_size_zero(self):
diff --git a/tools/install_venv.py b/tools/install_venv.py
deleted file mode 100644
index c190886d..0000000
--- a/tools/install_venv.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-"""
-Installation script for Kong's testing virtualenv
-"""
-
-import os
-import stat
-import string
-import subprocess
-import sys
-
-ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
-VENV = os.path.join(ROOT, '.kong-venv')
-PIP_REQUIRES = os.path.join(ROOT, 'tools', 'pip-requires')
-
-
-def die(message, *args):
- print >> sys.stderr, message % args
- sys.exit(1)
-
-
-def whereis(executable):
- """
- Detect whereis a binary and make sure it's executable we can execute.
- """
- for d in string.split(os.environ['PATH'], \
- os.pathsep):
- f = os.path.join(d, executable)
- if os.path.isfile(f):
- try:
- st = os.stat(f)
- except OSError:
- continue
- if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
- return True
- return False
-
-
-def run_command(cmd, redirect_output=True, check_exit_code=True):
- """
- Runs a command in an out-of-process shell, returning the
- output of that command. Working directory is ROOT.
- """
- if redirect_output:
- stdout = subprocess.PIPE
- else:
- stdout = None
-
- proc = subprocess.Popen(cmd, cwd=ROOT, stdout=stdout)
- output = proc.communicate()[0]
- if check_exit_code and proc.returncode != 0:
- die('Command "%s" failed.\n%s', ' '.join(cmd), output)
- return output
-
-
-HAS_EASY_INSTALL = bool(whereis("easy_install"))
-HAS_VIRTUALENV = bool(whereis("virtualenv"))
-
-
-def check_dependencies():
- """Make sure virtualenv is in the path."""
-
- if not HAS_VIRTUALENV:
- print 'not found.'
- # Try installing it via easy_install...
- if HAS_EASY_INSTALL:
- print 'Installing virtualenv via easy_install...',
- if not run_command(['easy_install', 'virtualenv']):
- die('ERROR: virtualenv not found.\n\n'
- 'Glance development requires virtualenv, please install'
- ' it using your favorite package management tool')
- print 'done.'
- print 'done.'
-
-
-def create_virtualenv(venv=VENV):
- """Creates the virtual environment and installs PIP only into the
- virtual environment
- """
- print 'Creating venv...',
- run_command(['virtualenv', '-q', '--no-site-packages', VENV])
- print 'done.'
- print 'Installing pip in virtualenv...',
- if not run_command(['tools/with_venv.sh', 'easy_install', 'pip']).strip():
- die("Failed to install pip.")
- print 'done.'
-
-
-def install_dependencies(venv=VENV):
- print 'Installing dependencies with pip (this can take a while)...'
-
- # Install greenlet by hand - just listing it in the requires file does not
- # get it in stalled in the right order
- venv_tool = 'tools/with_venv.sh'
- run_command([venv_tool, 'pip', 'install', '-E', venv, '-r', PIP_REQUIRES],
- redirect_output=False)
-
- python_version = "python%s.%s" % (sys.version_info[0], sys.version_info[1])
-
- # Tell the virtual env how to "import glance"
- pthfile = os.path.join(venv, "lib", python_version, "site-packages",
- "glance.pth")
- f = open(pthfile, 'w')
- f.write("%s\n" % ROOT)
-
-
-def print_help():
- help = """
- Kong testing environment setup is complete.
-
- Kong testing uses virtualenv to track and manage Python dependencies
- while in development and testing.
-
- To activate the Kong virtualenv for the extent of your current shell
- session you can run:
-
- $ source .kong-venv/bin/activate
-
- Or, if you prefer, you can run commands in the virtualenv on a case by case
- basis by running:
-
- $ tools/with_venv.sh <your command>
-
- Also, make test will automatically use the virtualenv.
- """
- print help
-
-
-def main(argv):
- check_dependencies()
- create_virtualenv()
- install_dependencies()
- print_help()
-
-if __name__ == '__main__':
- main(sys.argv)
diff --git a/tools/pip-requires b/tools/pip-requires
index 02c965b..e3ee18b 100644
--- a/tools/pip-requires
+++ b/tools/pip-requires
@@ -1,5 +1,3 @@
-pep8>=0.5.0
-pylint==0.19
anyjson
nose
argparse
diff --git a/tools/rfc.sh b/tools/rfc.sh
deleted file mode 100755
index 14f9163..0000000
--- a/tools/rfc.sh
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/bin/sh -e
-# Copyright (c) 2010-2011 Gluster, Inc. <http://www.gluster.com>
-# This initial version of this file was taken from the source tree
-# of GlusterFS. It was not directly attributed, but is assumed to be
-# Copyright (c) 2010-2011 Gluster, Inc and release GPLv3
-# Subsequent modifications are Copyright (c) 2011 OpenStack, LLC.
-#
-# GlusterFS is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published
-# by the Free Software Foundation; either version 3 of the License,
-# or (at your option) any later version.
-#
-# GlusterFS is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see
-# <http://www.gnu.org/licenses/>.
-
-
-branch="master";
-
-set_hooks_commit_msg()
-{
- top_dir=`git rev-parse --show-toplevel`
- f="${top_dir}/.git/hooks/commit-msg";
- u="https://review.openstack.org/tools/hooks/commit-msg";
-
- if [ -x "$f" ]; then
- return;
- fi
-
- curl -o $f $u || wget -O $f $u;
-
- chmod +x $f;
-
- GIT_EDITOR=true git commit --amend
-}
-
-add_remote()
-{
- username=$1
- project=$2
-
- echo "No remote set, testing ssh://$username@review.openstack.org:29418"
- if ssh -p29418 -o StrictHostKeyChecking=no $username@review.openstack.org gerrit ls-projects >/dev/null 2>&1
- then
- echo "$username@review.openstack.org:29418 worked."
- echo "Creating a git remote called gerrit that maps to:"
- echo " ssh://$username@review.openstack.org:29418/$project"
- git remote add gerrit ssh://$username@review.openstack.org:29418/$project
- return 0
- fi
- return 1
-}
-
-check_remote()
-{
- if ! git remote | grep gerrit >/dev/null 2>&1
- then
- origin_project=`git remote show origin | grep 'Fetch URL' | perl -nle '@fields = split(m|[:/]|); $len = $#fields; print $fields[$len-1], "/", $fields[$len];'`
- if add_remote $USERNAME $origin_project
- then
- return 0
- else
- echo "Your local name doesn't work on Gerrit."
- echo -n "Enter Gerrit username (same as launchpad): "
- read gerrit_user
- if add_remote $gerrit_user $origin_project
- then
- return 0
- else
- echo "Can't infer where gerrit is - please set a remote named"
- echo "gerrit manually and then try again."
- echo
- echo "For more information, please see:"
- echo "\thttp://wiki.openstack.org/GerritWorkflow"
- exit 1
- fi
- fi
- fi
-}
-
-rebase_changes()
-{
- git fetch;
-
- GIT_EDITOR=true git rebase -i origin/$branch || exit $?;
-}
-
-
-assert_diverge()
-{
- if ! git diff origin/$branch..HEAD | grep -q .
- then
- echo "No changes between the current branch and origin/$branch."
- exit 1
- fi
-}
-
-
-main()
-{
- set_hooks_commit_msg;
-
- check_remote;
-
- rebase_changes;
-
- assert_diverge;
-
- bug=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]ug|[Ll][Pp])\s*[#:]?\s*(\d+)/) {print "$2"; exit}')
-
- bp=$(git show --format='%s %b' | perl -nle 'if (/\b([Bb]lue[Pp]rint|[Bb][Pp])\s*[#:]?\s*([0-9a-zA-Z-_]+)/) {print "$2"; exit}')
-
- if [ "$DRY_RUN" = 1 ]; then
- drier='echo -e Please use the following command to send your commits to review:\n\n'
- else
- drier=
- fi
-
- local_branch=`git branch | grep -Ei "\* (.*)" | cut -f2 -d' '`
- if [ -z "$bug" ]; then
- if [ -z "$bp" ]; then
- $drier git push gerrit HEAD:refs/for/$branch/$local_branch;
- else
- $drier git push gerrit HEAD:refs/for/$branch/bp/$bp;
- fi
- else
- $drier git push gerrit HEAD:refs/for/$branch/bug/$bug;
- fi
-}
-
-main "$@"
diff --git a/tools/skip_tracker.py b/tools/skip_tracker.py
index fd15c1c..9b12eb7 100644
--- a/tools/skip_tracker.py
+++ b/tools/skip_tracker.py
@@ -83,17 +83,21 @@
if __name__ == '__main__':
- logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
+ logging.basicConfig(format='%(levelname)s: %(message)s',
+ level=logging.INFO)
results = find_skips()
unique_bugs = sorted(set([bug for (method, bug) in results]))
unskips = []
info("Total bug skips found: %d", len(results))
info("Total unique bugs causing skips: %d", len(unique_bugs))
- lp = launchpad.Launchpad.login_anonymously('grabbing bugs', 'production', LPCACHEDIR)
+ lp = launchpad.Launchpad.login_anonymously('grabbing bugs',
+ 'production',
+ LPCACHEDIR)
for bug_no in unique_bugs:
bug = lp.bugs[bug_no]
for task in bug.bug_tasks:
- info("Bug #%7s (%12s - %12s)", bug_no, task.importance, task.status)
+ info("Bug #%7s (%12s - %12s)", bug_no,
+ task.importance, task.status)
if task.status in ('Fix Released', 'Fix Committed'):
unskips.append(bug_no)
diff --git a/tools/test-requires b/tools/test-requires
new file mode 100644
index 0000000..77a6614
--- /dev/null
+++ b/tools/test-requires
@@ -0,0 +1,2 @@
+pep8>=0.5.0
+pylint==0.19
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..c260fd8
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,18 @@
+[tox]
+envlist = pep8
+
+[testenv]
+setenv = VIRTUAL_ENV={envdir}
+ NOSE_WITH_OPENSTACK=1
+ NOSE_OPENSTACK_COLOR=1
+ NOSE_OPENSTACK_RED=15
+ NOSE_OPENSTACK_YELLOW=3
+ NOSE_OPENSTACK_SHOW_ELAPSED=1
+ NOSE_OPENSTACK_STDOUT=1
+deps = -r{toxinidir}/tools/pip-requires
+ -r{toxinidir}/tools/test-requires
+commands = nosetests {posargs}
+
+[testenv:pep8]
+deps = pep8==1.1
+commands = pep8 --repeat --show-source --exclude=.venv,.tox,dist,doc,openstack,kong .