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 .