diff --git a/.gitignore b/.gitignore
index 2260627..963e589 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,9 +38,6 @@
 .project
 .pydevproject
 
-# PyCharm
-.idea
-
 # Complexity
 output/*.html
 output/*/index.html
@@ -58,4 +55,4 @@
 .*sw?
 
 # Files created by releasenotes build
-releasenotes/build
+releasenotes/build
\ No newline at end of file
diff --git a/octavia_tempest_plugin/config.py b/octavia_tempest_plugin/config.py
deleted file mode 100644
index c722b97..0000000
--- a/octavia_tempest_plugin/config.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright 2016 Rackspace Inc.
-# Copyright 2017 Catalyst IT Ltd
-#
-#    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.
-
-
-from oslo_config import cfg
-
-
-service_option = cfg.BoolOpt(
-    'loadbalancer',
-    default=True,
-    help="Whether or not loadbalancing service is expected to be available"
-)
-
-octavia_group = cfg.OptGroup(name='loadbalancer',
-                             title='Loadbalancing Service Options')
-
-OctaviaGroup = [
-    cfg.StrOpt("region",
-               default="",
-               help="The region name to use. If empty, the value "
-                    "of identity.region is used instead. If no such region "
-                    "is found in the service catalog, the first found one is "
-                    "used."),
-    cfg.StrOpt('catalog_type',
-               default='load-balancer',
-               help='Catalog type of the Octavia service.'),
-    cfg.StrOpt('endpoint_type',
-               default='publicURL',
-               choices=['public', 'admin', 'internal',
-                        'publicURL', 'adminURL', 'internalURL'],
-               help="The endpoint type to use for the Octavia service."),
-    cfg.IntOpt('build_interval',
-               default=5,
-               help='Time in seconds between build status checks for '
-                    'non-loadbalancer resources to build'),
-    cfg.IntOpt('build_timeout',
-               default=30,
-               help='Timeout in seconds to wait for non-loadbalancer '
-                    'resources to build'),
-    cfg.IntOpt('lb_build_interval',
-               default=10,
-               help='Time in seconds between build status checks for a '
-                    'loadbalancer.'),
-    cfg.IntOpt('lb_build_timeout',
-               default=900,
-               help='Timeout in seconds to wait for a '
-                    'loadbalancer to build.'),
-    cfg.StrOpt('premade_server_ip',
-               default=None,
-               help='IP of the premade server.'),
-    cfg.StrOpt('premade_server_subnet_id',
-               default=None,
-               help='Subnet ID of the premade server.'),
-    cfg.StrOpt('vip_network_id',
-               default=None,
-               help='Existing network ID to use for loadbalancer.'),
-    cfg.StrOpt('vip_subnet_id',
-               default=None,
-               help='Existing subnet ID to use for loadbalancer.'),
-    cfg.IntOpt('random_server_name_length',
-               default=0,
-               help='If non-zero, generate a random name of the length '
-                    'provided for each server, in the format "m[A-Z0-9]*". '),
-    cfg.StrOpt('availability_zone',
-               default=None,
-               help='Availability zone to use for creating servers.'),
-    cfg.StrOpt('member_role',
-               default='load-balancer_member',
-               help="Role to add to users created for octavia tests."),
-    cfg.StrOpt('vip_qos_policy_id',
-               default=None,
-               help='Existing QoS Policy ID in neutron to use for'
-                    'loadbalancer.')
-]
diff --git a/octavia_tempest_plugin/contrib/__init__.py b/octavia_tempest_plugin/contrib/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/contrib/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/contrib/httpd/__init__.py b/octavia_tempest_plugin/contrib/httpd/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/contrib/httpd/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/plugin.py b/octavia_tempest_plugin/plugin.py
deleted file mode 100644
index 4d5f6a2..0000000
--- a/octavia_tempest_plugin/plugin.py
+++ /dev/null
@@ -1,62 +0,0 @@
-#   Copyright 2017 GoDaddy
-#   Copyright 2017 Catalyst IT Ltd
-#
-#   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 os
-
-from tempest import config
-from tempest.test_discover import plugins
-
-from octavia_tempest_plugin import config as project_config
-
-
-class OctaviaTempestPlugin(plugins.TempestPlugin):
-    def load_tests(self):
-        base_path = os.path.split(os.path.dirname(
-            os.path.abspath(__file__)))[0]
-        test_dir = "octavia_tempest_plugin/tests"
-        full_test_dir = os.path.join(base_path, test_dir)
-
-        return full_test_dir, base_path
-
-    def register_opts(self, conf):
-        conf.register_opt(
-            project_config.service_option, group='service_available'
-        )
-        conf.register_group(project_config.octavia_group)
-        conf.register_opts(project_config.OctaviaGroup,
-                           group=project_config.octavia_group.name)
-
-    def get_opt_lists(self):
-        return [
-            ('service_available', [project_config.service_option]),
-            (project_config.octavia_group.name, project_config.OctaviaGroup)
-        ]
-
-    def get_service_clients(self):
-        octavia_config = config.service_client_config(
-            project_config.octavia_group.name
-        )
-        module_path = 'octavia_tempest_plugin.services.v2.loadbalancer_client'
-
-        params = {
-            'name': 'octavia_v2',
-            'service_version': 'octavia.v2',
-            'module_path': module_path,
-            'client_names': ['LoadbalancerClient'],
-        }
-        params.update(octavia_config)
-
-        return [params]
diff --git a/octavia_tempest_plugin/services/__init__.py b/octavia_tempest_plugin/services/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/services/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/services/v2/__init__.py b/octavia_tempest_plugin/services/v2/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/services/v2/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/services/v2/base.py b/octavia_tempest_plugin/services/v2/base.py
deleted file mode 100644
index 22ed5f2..0000000
--- a/octavia_tempest_plugin/services/v2/base.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Copyright 2017 Catalyst IT Ltd
-#
-#    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 json
-
-from oslo_serialization import jsonutils
-from tempest.lib.common import rest_client
-
-
-class LoadbalancerClientBase(rest_client.RestClient):
-    def get_list_objs(self, obj):
-        resp, body = self.get('/v2.0/lbaas/%s' % obj)
-
-        return resp, jsonutils.loads(body)
-
-    def delete_obj(self, obj, id, cascade=False):
-        url = '/v2.0/lbaas/{obj}/{id}'.format(obj=obj, id=id)
-        if cascade:
-            url += '?cascade=True'
-        return self.delete(url)
-
-    def get_obj(self, obj, id):
-        resp, body = self.get('/v2.0/lbaas/{obj}/{id}'.format(obj=obj, id=id))
-
-        return resp, jsonutils.loads(body)
-
-    def post_json(self, obj, req_body, extra_headers={}):
-        headers = {"Content-Type": "application/json"}
-        headers = dict(headers, **extra_headers)
-        url_path = '/v2.0/lbaas/%s' % obj
-
-        resp, body = self.post(url_path, json.dumps(req_body), headers=headers)
-
-        return resp, jsonutils.loads(body)
-
-    def put_json(self, obj, id, req_body, extra_headers={}):
-        headers = {"Content-Type": "application/json"}
-        headers = dict(headers, **extra_headers)
-        url_path = '/v2.0/lbaas/%s/%s' % (obj, id)
-
-        resp, body = self.put(url_path, json.dumps(req_body), headers=headers)
-
-        return resp, jsonutils.loads(body)
diff --git a/octavia_tempest_plugin/services/v2/loadbalancer_client.py b/octavia_tempest_plugin/services/v2/loadbalancer_client.py
deleted file mode 100644
index 4af302a..0000000
--- a/octavia_tempest_plugin/services/v2/loadbalancer_client.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2017 GoDaddy
-# Copyright 2017 Catalyst IT Ltd
-#
-#   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.
-#
-from tempest.lib import exceptions
-
-from octavia_tempest_plugin.services.v2 import base as client_base
-
-
-class LoadbalancerClient(client_base.LoadbalancerClientBase):
-    """Tempest REST client for Octavia V2 API."""
-
-    def delete_resource(self, res, id, ignore_error=False, cascade=False):
-        try:
-            resp, _ = self.delete_obj(res, id, cascade=cascade)
-            return resp
-        except (exceptions.NotFound, exceptions.Conflict):
-            if ignore_error:
-                return None
diff --git a/octavia_tempest_plugin/tests/server_util.py b/octavia_tempest_plugin/tests/server_util.py
deleted file mode 100644
index 54fa4f8..0000000
--- a/octavia_tempest_plugin/tests/server_util.py
+++ /dev/null
@@ -1,326 +0,0 @@
-# Copyright 2017 Catalyst IT Ltd
-#
-#    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 pkg_resources
-import random
-import shlex
-import string
-import subprocess
-import tempfile
-import time
-
-from oslo_log import log as logging
-from oslo_utils import excutils
-from tempest import config
-from tempest.lib.common import fixed_network
-from tempest.lib.common import rest_client
-from tempest.lib.common.utils.linux import remote_client
-from tempest.lib.common.utils import test_utils
-from tempest.lib import exceptions
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-SERVER_BINARY = pkg_resources.resource_filename(
-    'octavia_tempest_plugin.contrib.httpd', 'httpd.bin')
-
-
-class BuildErrorException(exceptions.TempestException):
-    message = "Server %(server_id)s failed to build and is in ERROR status"
-
-
-def _get_task_state(body):
-    return body.get('OS-EXT-STS:task_state', None)
-
-
-def wait_for_server_status(client, server_id, status, ready_wait=True,
-                           extra_timeout=0, raise_on_error=True):
-    """Waits for a server to reach a given status."""
-
-    # NOTE(afazekas): UNKNOWN status possible on ERROR
-    # or in a very early stage.
-    body = client.show_server(server_id)['server']
-    old_status = server_status = body['status']
-    old_task_state = task_state = _get_task_state(body)
-    start_time = int(time.time())
-    timeout = client.build_timeout + extra_timeout
-    while True:
-        # NOTE(afazekas): Now the BUILD status only reached
-        # between the UNKNOWN->ACTIVE transition.
-        # TODO(afazekas): enumerate and validate the stable status set
-        if status == 'BUILD' and server_status != 'UNKNOWN':
-            return
-        if server_status == status:
-            if ready_wait:
-                if status == 'BUILD':
-                    return
-                # NOTE(afazekas): The instance is in "ready for action state"
-                # when no task in progress
-                if task_state is None:
-                    # without state api extension 3 sec usually enough
-                    time.sleep(CONF.compute.ready_wait)
-                    return
-            else:
-                return
-
-        time.sleep(client.build_interval)
-        body = client.show_server(server_id)['server']
-        server_status = body['status']
-        task_state = _get_task_state(body)
-        if (server_status != old_status) or (task_state != old_task_state):
-            LOG.info('State transition "%s" ==> "%s" after %d second wait',
-                     '/'.join((old_status, str(old_task_state))),
-                     '/'.join((server_status, str(task_state))),
-                     time.time() - start_time)
-        if (server_status == 'ERROR') and raise_on_error:
-            if 'fault' in body:
-                raise BuildErrorException(body['fault'],
-                                          server_id=server_id)
-            else:
-                raise BuildErrorException(server_id=server_id)
-
-        timed_out = int(time.time()) - start_time >= timeout
-
-        if timed_out:
-            expected_task_state = 'None' if ready_wait else 'n/a'
-            message = ('Server %(server_id)s failed to reach %(status)s '
-                       'status and task state "%(expected_task_state)s" '
-                       'within the required time (%(timeout)s s).' %
-                       {'server_id': server_id,
-                        'status': status,
-                        'expected_task_state': expected_task_state,
-                        'timeout': timeout})
-            message += ' Current status: %s.' % server_status
-            message += ' Current task state: %s.' % task_state
-            caller = test_utils.find_test_caller()
-            if caller:
-                message = '(%s) %s' % (caller, message)
-            raise exceptions.TimeoutException(message)
-        old_status = server_status
-        old_task_state = task_state
-
-
-def wait_for_server_termination(client, server_id, ignore_error=False):
-    """Waits for server to reach termination."""
-    try:
-        body = client.show_server(server_id)['server']
-    except exceptions.NotFound:
-        return
-    old_status = body['status']
-    old_task_state = _get_task_state(body)
-    start_time = int(time.time())
-    while True:
-        time.sleep(client.build_interval)
-        try:
-            body = client.show_server(server_id)['server']
-        except exceptions.NotFound:
-            return
-        server_status = body['status']
-        task_state = _get_task_state(body)
-        if (server_status != old_status) or (task_state != old_task_state):
-            LOG.info('State transition "%s" ==> "%s" after %d second wait',
-                     '/'.join((old_status, str(old_task_state))),
-                     '/'.join((server_status, str(task_state))),
-                     time.time() - start_time)
-        if server_status == 'ERROR' and not ignore_error:
-            raise exceptions.DeleteErrorException(resource_id=server_id)
-
-        if int(time.time()) - start_time >= client.build_timeout:
-            raise exceptions.TimeoutException
-        old_status = server_status
-        old_task_state = task_state
-
-
-def create_server(clients, name=None, flavor=None, image_id=None,
-                  validatable=False, validation_resources=None,
-                  tenant_network=None, wait_until=None, availability_zone=None,
-                  **kwargs):
-    """Common wrapper utility returning a test server.
-
-    This method is a common wrapper returning a test server that can be
-    pingable or sshable.
-
-    :param name: Name of the server to be provisioned. If not defined a random
-        string ending with '-instance' will be generated.
-    :param flavor: Flavor of the server to be provisioned. If not defined,
-        CONF.compute.flavor_ref will be used instead.
-    :param image_id: ID of the image to be used to provision the server. If not
-        defined, CONF.compute.image_ref will be used instead.
-    :param clients: Client manager which provides OpenStack Tempest clients.
-    :param validatable: Whether the server will be pingable or sshable.
-    :param validation_resources: Resources created for the connection to the
-        server. Include a keypair, a security group and an IP.
-    :param tenant_network: Tenant network to be used for creating a server.
-    :param wait_until: Server status to wait for the server to reach after
-        its creation.
-    :returns: a tuple
-    """
-    if name is None:
-        r = random.SystemRandom()
-        name = "m{}".format("".join(
-            [r.choice(string.ascii_uppercase + string.digits)
-             for i in range(
-                CONF.loadbalancer.random_server_name_length - 1)]
-        ))
-    if flavor is None:
-        flavor = CONF.compute.flavor_ref
-    if image_id is None:
-        image_id = CONF.compute.image_ref
-    if availability_zone is None:
-        availability_zone = CONF.loadbalancer.availability_zone
-
-    kwargs = fixed_network.set_networks_kwarg(
-        tenant_network, kwargs) or {}
-
-    if availability_zone:
-        kwargs.update({'availability_zone': availability_zone})
-
-    if CONF.validation.run_validation and validatable:
-        LOG.debug("Provisioning test server with validation resources %s",
-                  validation_resources)
-        if 'security_groups' in kwargs:
-            kwargs['security_groups'].append(
-                {'name': validation_resources['security_group']['name']})
-        else:
-            try:
-                kwargs['security_groups'] = [
-                    {'name': validation_resources['security_group']['name']}]
-            except KeyError:
-                LOG.debug("No security group provided.")
-
-        if 'key_name' not in kwargs:
-            try:
-                kwargs['key_name'] = validation_resources['keypair']['name']
-            except KeyError:
-                LOG.debug("No key provided.")
-
-        if CONF.validation.connect_method == 'floating':
-            if wait_until is None:
-                wait_until = 'ACTIVE'
-
-    body = clients.servers_client.create_server(
-        name=name,
-        imageRef=image_id,
-        flavorRef=flavor,
-        config_drive=True,
-        **kwargs
-    )
-    server = rest_client.ResponseBody(body.response, body['server'])
-
-    def _setup_validation_fip():
-        if CONF.service_available.neutron:
-            ifaces = clients.interfaces_client.list_interfaces(server['id'])
-            validation_port = None
-            for iface in ifaces['interfaceAttachments']:
-                if not tenant_network or (iface['net_id'] ==
-                                          tenant_network['id']):
-                    validation_port = iface['port_id']
-                    break
-            if not validation_port:
-                # NOTE(artom) This will get caught by the catch-all clause in
-                # the wait_until loop below
-                raise ValueError('Unable to setup floating IP for validation: '
-                                 'port not found on tenant network')
-            clients.floating_ips_client.update_floatingip(
-                validation_resources['floating_ip']['id'],
-                port_id=validation_port)
-        else:
-            fip_client = clients.compute_floating_ips_client
-            fip_client.associate_floating_ip_to_server(
-                floating_ip=validation_resources['floating_ip']['ip'],
-                server_id=server['id'])
-
-    if wait_until:
-        try:
-            wait_for_server_status(
-                clients.servers_client, server['id'], wait_until)
-
-            # Multiple validatable servers are not supported for now. Their
-            # creation will fail with the condition above (l.58).
-            if CONF.validation.run_validation and validatable:
-                if CONF.validation.connect_method == 'floating':
-                    _setup_validation_fip()
-
-        except Exception:
-            with excutils.save_and_reraise_exception():
-                try:
-                    clients.servers_client.delete_server(server['id'])
-                except Exception:
-                    LOG.exception('Deleting server %s failed', server['id'])
-                try:
-                    wait_for_server_termination(clients.servers_client,
-                                                server['id'])
-                except Exception:
-                    LOG.exception('Server %s failed to delete in time',
-                                  server['id'])
-
-    return server
-
-
-def clear_server(servers_client, id):
-    try:
-        servers_client.delete_server(id)
-    except exceptions.NotFound:
-        pass
-    wait_for_server_termination(servers_client, id)
-
-
-def _execute(cmd, cwd=None):
-    args = shlex.split(cmd)
-    subprocess_args = {'stdout': subprocess.PIPE,
-                       'stderr': subprocess.STDOUT,
-                       'cwd': cwd}
-    proc = subprocess.Popen(args, **subprocess_args)
-    stdout, stderr = proc.communicate()
-    if proc.returncode != 0:
-        LOG.error('Command %s returned with exit status %s, output %s, '
-                  'error %s', cmd, proc.returncode, stdout, stderr)
-        raise exceptions.CommandFailed(proc.returncode, cmd, stdout, stderr)
-    return stdout
-
-
-def copy_file(floating_ip, private_key, local_file, remote_file):
-    """Copy web server script to instance."""
-    with tempfile.NamedTemporaryFile() as key:
-        key.write(private_key.encode('utf-8'))
-        key.flush()
-        dest = (
-            "%s@%s:%s" %
-            (CONF.validation.image_ssh_user, floating_ip, remote_file)
-        )
-        cmd = ("scp -v -o UserKnownHostsFile=/dev/null "
-               "-o StrictHostKeyChecking=no "
-               "-i %(key_file)s %(file)s %(dest)s" % {'key_file': key.name,
-                                                      'file': local_file,
-                                                      'dest': dest})
-        return _execute(cmd)
-
-
-def run_webserver(connect_ip, private_key):
-    httpd = "/dev/shm/httpd.bin"
-
-    linux_client = remote_client.RemoteClient(
-        connect_ip,
-        CONF.validation.image_ssh_user,
-        pkey=private_key,
-    )
-    linux_client.validate_authentication()
-
-    # TODO(kong): We may figure out an elegant way to copy file to instance
-    # in future.
-    LOG.debug("Copying the webserver binary to the server.")
-    copy_file(connect_ip, private_key, SERVER_BINARY, httpd)
-
-    LOG.debug("Starting services on the server.")
-    linux_client.exec_command('sudo screen -d -m %s -port 80 -id 1' % httpd)
-    linux_client.exec_command('sudo screen -d -m %s -port 81 -id 2' % httpd)
diff --git a/octavia_tempest_plugin/tests/test_octavia_tempest_plugin.py b/octavia_tempest_plugin/tests/test_octavia_tempest_plugin.py
new file mode 100644
index 0000000..7805347
--- /dev/null
+++ b/octavia_tempest_plugin/tests/test_octavia_tempest_plugin.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+
+# 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.
+
+"""
+test_octavia_tempest_plugin
+----------------------------------
+
+Tests for `octavia_tempest_plugin` module.
+"""
+
+from octavia_tempest_plugin.tests import base
+
+
+class TestOctavia_tempest_plugin(base.TestCase):
+
+    def test_something(self):
+        pass
diff --git a/octavia_tempest_plugin/tests/v2/__init__.py b/octavia_tempest_plugin/tests/v2/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/tests/v2/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/tests/v2/api/test_loadbalancer.py b/octavia_tempest_plugin/tests/v2/api/test_loadbalancer.py
deleted file mode 100644
index 4325321..0000000
--- a/octavia_tempest_plugin/tests/v2/api/test_loadbalancer.py
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright 2017 GoDaddy
-# Copyright 2017 Catalyst IT Ltd
-#
-#   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.
-from tempest.lib.common.utils import data_utils
-from tempest.lib import decorators
-
-from octavia_tempest_plugin.tests.v2 import base
-
-
-class LoadbalancerTest(base.BaseLoadbalancerTest):
-    name_prefix = 'Tempest-LoadbalancerTest'
-
-    @decorators.idempotent_id('94c66b04-1ab3-4375-a921-89e48d833c1d')
-    @decorators.attr(type='slow')
-    def test_crud_loadbalancer(self):
-        # Create loadbalancer
-        params = {}
-        if self.vip_network_id:
-            params['vip_network_id'] = self.vip_network_id
-        if self.vip_subnet_id:
-            params['vip_subnet_id'] = self.vip_subnet_id
-        lb_id = self.create_loadbalancer(**params)['id']
-
-        # Get loadbalancers
-        resp, body = self.lb_client.get_list_objs('loadbalancers')
-        self.assertEqual(200, resp.status)
-        self.assertIn(
-            lb_id,
-            [item['id'] for item in body['loadbalancers']]
-        )
-
-        # Update loadbalancer
-        new_name = data_utils.rand_name('lb', prefix=self.name_prefix)
-        self.update_loadbalancer(lb_id, name=new_name)
-
-        # Get loadbalancer
-        resp, body = self.lb_client.get_obj('loadbalancers', lb_id)
-        self.assertEqual(200, resp.status)
-        self.assertEqual(new_name, body['loadbalancer']['name'])
-
-        # Delete loadbalancer
-        self.delete_loadbalancer(lb_id)
-
-        # Get loadbalancers
-        resp, body = self.lb_client.get_list_objs('loadbalancers')
-        self.assertEqual(200, resp.status)
-        self.assertNotIn(
-            lb_id,
-            [item['id'] for item in body['loadbalancers']]
-        )
diff --git a/octavia_tempest_plugin/tests/v2/base.py b/octavia_tempest_plugin/tests/v2/base.py
deleted file mode 100644
index fccca0c..0000000
--- a/octavia_tempest_plugin/tests/v2/base.py
+++ /dev/null
@@ -1,523 +0,0 @@
-# Copyright 2017 GoDaddy
-# Copyright 2017 Catalyst IT Ltd
-#
-#   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 time
-
-from oslo_log import log as logging
-import requests
-from tempest import config
-from tempest.lib.common.utils import data_utils
-from tempest.lib.common.utils import test_utils
-from tempest.lib import exceptions as lib_exc
-from tempest import test
-import tenacity
-
-from octavia_tempest_plugin.tests import server_util
-
-CONF = config.CONF
-LOG = logging.getLogger(__name__)
-
-
-class BaseLoadbalancerTest(test.BaseTestCase):
-    credentials = (['lbmember', CONF.loadbalancer.member_role], 'admin')
-    name_prefix = 'Tempest-BaseLoadbalancerTest'
-    vip_network_id = None
-    vip_subnet_id = None
-    vip_address = None
-    member_subnet_id = None
-    member_network_id = None
-    vm_ip = None
-
-    @classmethod
-    def skip_checks(cls):
-        super(BaseLoadbalancerTest, cls).skip_checks()
-
-        if not CONF.service_available.loadbalancer:
-            raise cls.skipException("Loadbalancing service is not available.")
-
-        service_list = {
-            'loadbalancing': CONF.service_available.loadbalancer,
-            'compute': CONF.service_available.nova,
-            'image': CONF.service_available.glance,
-            'neutron': CONF.service_available.neutron
-        }
-        for srv, available in service_list.items():
-            if not available:
-                raise cls.skipException("Service %s is not available." % srv)
-
-    @classmethod
-    def setup_clients(cls):
-        super(BaseLoadbalancerTest, cls).setup_clients()
-
-        cls.lb_client = cls.os_roles_lbmember.octavia_v2.LoadbalancerClient()
-        cls.servers_client = cls.os_roles_lbmember.servers_client
-        cls.networks_client = cls.os_roles_lbmember.networks_client
-        cls.subnets_client = cls.os_roles_lbmember.subnets_client
-        cls.interfaces_client = cls.os_roles_lbmember.interfaces_client
-        cls.sg_rule_client = cls.os_roles_lbmember.security_group_rules_client
-        cls.floatingip_client = cls.os_roles_lbmember.floating_ips_client
-        cls.routers_adm_client = cls.os_admin.routers_client
-
-        if CONF.identity.auth_version == 'v3':
-            project_id = cls.os_roles_lbmember.auth_provider.auth_data[1][
-                'project']['id']
-        else:
-            project_id = cls.os_roles_lbmember.auth_provider.auth_data[
-                1]['token']['tenant']['id']
-
-        cls.tenant_id = project_id
-        cls.user_id = cls.os_roles_lbmember.auth_provider.auth_data[1][
-            'user']['id']
-
-    @classmethod
-    def resource_setup(cls):
-        """Creates network resources."""
-        super(BaseLoadbalancerTest, cls).resource_setup()
-        if not CONF.loadbalancer.vip_network_id:
-            network_name = data_utils.rand_name(
-                'network',
-                prefix=cls.name_prefix
-            )
-            body = cls.networks_client.create_network(name=network_name)
-            cls.vip_network_id = body['network']['id']
-            cls.addClassResourceCleanup(
-                test_utils.call_and_ignore_notfound_exc,
-                cls.networks_client.delete_network,
-                cls.vip_network_id
-            )
-
-            subnet_name = data_utils.rand_name(
-                'subnet',
-                prefix=cls.name_prefix
-            )
-            body = cls.subnets_client.create_subnet(
-                name=subnet_name,
-                network_id=cls.vip_network_id,
-                cidr='10.100.1.0/24',
-                ip_version=4,
-                gateway_ip='10.100.1.1',
-            )
-            cls.vip_subnet_id = body['subnet']['id']
-            cls.addClassResourceCleanup(
-                test_utils.call_and_ignore_notfound_exc,
-                cls.subnets_client.delete_subnet,
-                cls.vip_subnet_id
-            )
-            cls.member_network_id = cls.vip_network_id
-            cls.member_subnet_id = cls.vip_subnet_id
-
-            if CONF.validation.connect_method == 'floating':
-                router_name = data_utils.rand_name(
-                    'router',
-                    prefix=cls.name_prefix
-                )
-                kwargs = {
-                    'name': router_name,
-                    'tenant_id': cls.tenant_id
-                }
-                if CONF.network.public_network_id:
-                    kwargs['external_gateway_info'] = dict(
-                        network_id=CONF.network.public_network_id
-                    )
-                body = cls.routers_adm_client.create_router(**kwargs)
-                cls.router_id = body['router']['id']
-                cls.addClassResourceCleanup(
-                    test_utils.call_and_ignore_notfound_exc,
-                    cls.routers_adm_client.delete_router,
-                    cls.router_id,
-                )
-
-                cls.routers_adm_client.add_router_interface(
-                    cls.router_id, subnet_id=cls.member_subnet_id
-                )
-                cls.addClassResourceCleanup(
-                    test_utils.call_and_ignore_notfound_exc,
-                    cls.routers_adm_client.remove_router_interface,
-                    cls.router_id,
-                    subnet_id=cls.member_subnet_id
-                )
-        else:
-            cls.vip_network_id = CONF.loadbalancer.vip_network_id
-            cls.vip_subnet_id = CONF.loadbalancer.vip_subnet_id
-            cls.member_subnet_id = CONF.loadbalancer.premade_server_subnet_id
-
-    @tenacity.retry(
-        wait=tenacity.wait_fixed(CONF.loadbalancer.lb_build_interval),
-        stop=tenacity.stop_after_delay(CONF.loadbalancer.lb_build_timeout),
-        retry=tenacity.retry_if_exception_type(AssertionError)
-    )
-    def await_loadbalancer_active(self, id, name=None):
-        resp, body = self.lb_client.get_obj('loadbalancers', id)
-        self.assertEqual(200, resp.status)
-
-        lb = body['loadbalancer']
-
-        if lb['provisioning_status'] == 'ERROR':
-            raise Exception('Failed to wait for loadbalancer to be active, '
-                            'actual provisioning_status: ERROR')
-
-        self.assertEqual('ACTIVE', lb['provisioning_status'])
-
-        if name:
-            self.assertEqual(name, lb['name'])
-
-    @tenacity.retry(
-        wait=tenacity.wait_fixed(CONF.loadbalancer.lb_build_interval),
-        stop=tenacity.stop_after_delay(CONF.loadbalancer.lb_build_timeout),
-        retry=tenacity.retry_if_exception_type(AssertionError)
-    )
-    def await_loadbalancer_deleted(self, id):
-        resp, body = self.lb_client.get_obj('loadbalancers', id)
-        self.assertEqual(200, resp.status)
-
-        lb = body['loadbalancer']
-        self.assertEqual('DELETED', lb['provisioning_status'])
-
-    @tenacity.retry(
-        wait=tenacity.wait_fixed(CONF.loadbalancer.lb_build_interval),
-        stop=tenacity.stop_after_delay(CONF.loadbalancer.lb_build_timeout),
-        retry=tenacity.retry_if_exception_type(AssertionError)
-    )
-    def await_listener_active(self, id, name=None):
-        resp, body = self.lb_client.get_obj('listeners', id)
-        self.assertEqual(200, resp.status)
-
-        listener = body['listener']
-
-        if listener['provisioning_status'] == 'ERROR':
-            raise Exception('Failed to wait for listener to be active, actual '
-                            'provisioning_status: ERROR')
-
-        self.assertEqual('ACTIVE', listener['provisioning_status'])
-        self.assertEqual('ONLINE', listener['operating_status'])
-
-        if name:
-            self.assertEqual(name, listener['name'])
-
-    def create_loadbalancer(self, **kwargs):
-        name = data_utils.rand_name('lb', prefix=self.name_prefix)
-        payload = {'loadbalancer': {'name': name}}
-        payload['loadbalancer'].update(kwargs)
-
-        resp, body = self.lb_client.post_json('loadbalancers', payload)
-        self.assertEqual(201, resp.status)
-
-        lb = body['loadbalancer']
-        lb_id = lb['id']
-
-        self.addCleanup(self.delete_loadbalancer, lb_id, ignore_error=True)
-        LOG.info('Waiting for loadbalancer %s to be active', lb_id)
-        self.await_loadbalancer_active(
-            lb_id,
-            name=payload['loadbalancer']['name']
-        )
-
-        self.lb_id = lb['id']
-        self.vip_port = lb['vip_port_id']
-        if CONF.validation.connect_method == 'floating':
-            self.vip_address = self._associate_floatingip()
-        else:
-            self.vip_address = lb['vip_address']
-
-        return lb
-
-    def update_loadbalancer(self, lb_id, **kwargs):
-        new_name = data_utils.rand_name('lb', prefix=self.name_prefix)
-        payload = {'loadbalancer': {'name': new_name}}
-        payload['loadbalancer'].update(kwargs)
-
-        resp, _ = self.lb_client.put_json('loadbalancers', lb_id, payload)
-        self.assertEqual(200, resp.status)
-
-        # Wait for loadbalancer to be active
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after update', lb_id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def delete_loadbalancer(self, id, ignore_error=False):
-        """Delete loadbalancer and wait for it to be deleted.
-
-        Only if loadbalancer is deleted completely can other network resources
-        be deleted.
-        """
-        resp = self.lb_client.delete_resource('loadbalancers', id,
-                                              ignore_error=ignore_error,
-                                              cascade=True)
-        if resp:
-            self.assertEqual(204, resp.status)
-
-        LOG.info('Waiting for loadbalancer %s to be deleted', id)
-        self.await_loadbalancer_deleted(id)
-
-    def create_listener(self, lb_id, **kwargs):
-        name = data_utils.rand_name('listener', prefix=self.name_prefix)
-        payload = {
-            'listener': {
-                'protocol': 'HTTP',
-                'protocol_port': '80',
-                'loadbalancer_id': lb_id,
-                'name': name
-            }
-        }
-        payload['listener'].update(kwargs)
-
-        resp, body = self.lb_client.post_json('listeners', payload)
-        self.assertEqual(201, resp.status)
-
-        listener_id = body['listener']['id']
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after listener %s '
-            'creation', lb_id, listener_id
-        )
-        self.addCleanup(self.delete_listener, listener_id, lb_id,
-                        ignore_error=True)
-        self.await_loadbalancer_active(lb_id)
-
-        return body['listener']
-
-    def update_listener(self, listener_id, lb_id, **kwargs):
-        new_name = data_utils.rand_name('listener', prefix=self.name_prefix)
-        payload = {'listener': {'name': new_name}}
-        payload['listener'].update(kwargs)
-
-        resp, _ = self.lb_client.put_json('listeners', listener_id, payload)
-        self.assertEqual(200, resp.status)
-
-        # Wait for loadbalancer to be active
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after listener %s '
-            'update', lb_id, listener_id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def delete_listener(self, id, lb_id, ignore_error=False):
-        resp = self.lb_client.delete_resource('listeners', id,
-                                              ignore_error=ignore_error)
-        if resp:
-            self.assertEqual(204, resp.status)
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after deleting '
-            'listener %s', lb_id, id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def create_pool(self, lb_id, **kwargs):
-        name = data_utils.rand_name('pool', prefix=self.name_prefix)
-        payload = {
-            'pool': {
-                'name': name,
-                'loadbalancer_id': lb_id,
-                'lb_algorithm': 'ROUND_ROBIN',
-                'protocol': 'HTTP'
-            }
-        }
-        payload['pool'].update(kwargs)
-
-        resp, body = self.lb_client.post_json('pools', payload)
-        self.assertEqual(201, resp.status)
-
-        pool_id = body['pool']['id']
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after pool %s creation',
-            lb_id, pool_id
-        )
-        self.addCleanup(self.delete_pool, pool_id, lb_id, ignore_error=True)
-        self.await_loadbalancer_active(lb_id)
-
-        return body['pool']
-
-    def update_pool(self, pool_id, lb_id, **kwargs):
-        new_name = data_utils.rand_name('pool', prefix=self.name_prefix)
-        payload = {'pool': {'name': new_name}}
-        payload['pool'].update(kwargs)
-
-        resp, _ = self.lb_client.put_json('pools', pool_id, payload)
-        self.assertEqual(200, resp.status)
-
-        # Wait for loadbalancer to be active
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after pool %s update',
-            lb_id, pool_id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def delete_pool(self, id, lb_id, ignore_error=False):
-        resp = self.lb_client.delete_resource('pools', id,
-                                              ignore_error=ignore_error)
-        if resp:
-            self.assertEqual(204, resp.status)
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after deleting '
-            'pool %s', lb_id, id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def create_member(self, pool_id, lb_id, **kwargs):
-        name = data_utils.rand_name('member', prefix=self.name_prefix)
-        payload = {'member': {'name': name}}
-        payload['member'].update(kwargs)
-
-        resp, body = self.lb_client.post_json(
-            'pools/%s/members' % pool_id, payload
-        )
-        self.assertEqual(201, resp.status)
-
-        member_id = body['member']['id']
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after adding '
-            'member %s', lb_id, member_id
-        )
-        self.addCleanup(self.delete_member, member_id, pool_id,
-                        lb_id, ignore_error=True)
-        self.await_loadbalancer_active(lb_id)
-
-        return body['member']
-
-    def delete_member(self, id, pool_id, lb_id, ignore_error=False):
-        resp = self.lb_client.delete_resource(
-            'pools/%s/members' % pool_id,
-            id,
-            ignore_error=ignore_error
-        )
-        if resp:
-            self.assertEqual(204, resp.status)
-
-        LOG.info(
-            'Waiting for loadbalancer %s to be active after deleting '
-            'member %s', lb_id, id
-        )
-        self.await_loadbalancer_active(lb_id)
-
-    def _wait_for_lb_functional(self, vip_address):
-        session = requests.Session()
-        start = time.time()
-
-        while time.time() - start < CONF.loadbalancer.lb_build_timeout:
-            try:
-                session.get("http://{0}".format(vip_address), timeout=2)
-                time.sleep(1)
-                return
-            except Exception:
-                LOG.warning('Server is not passing initial traffic. Waiting.')
-                time.sleep(1)
-        LOG.error('Server did not begin passing traffic within the timeout '
-                  'period. Failing test.')
-        raise lib_exc.ServerFault()
-
-    def check_members_balanced(self):
-        session = requests.Session()
-        response_counts = {}
-
-        self._wait_for_lb_functional(self.vip_address)
-
-        # Send a number requests to lb vip
-        for i in range(20):
-            try:
-                r = session.get('http://{0}'.format(self.vip_address),
-                                timeout=2)
-                LOG.debug('Loadbalancer response: %s', r.content)
-
-                if r.content in response_counts:
-                    response_counts[r.content] += 1
-                else:
-                    response_counts[r.content] = 1
-
-            except Exception:
-                LOG.exception('Failed to send request to loadbalancer vip')
-                raise lib_exc.BadRequest(message='Failed to connect to lb')
-
-        # Ensure the correct number of members
-        self.assertEqual(2, len(response_counts))
-
-        # Ensure both members got the same number of responses
-        self.assertEqual(1, len(set(response_counts.values())))
-
-    def _delete_floatingip(self, floating_ip):
-        self.floatingip_client.update_floatingip(
-            floating_ip,
-            port_id=None
-        )
-        test_utils.call_and_ignore_notfound_exc(
-            self.floatingip_client.delete_floatingip, floating_ip
-        )
-
-    def _associate_floatingip(self):
-        # Associate floatingip with loadbalancer vip
-        floatingip = self.floatingip_client.create_floatingip(
-            floating_network_id=CONF.network.public_network_id
-        )['floatingip']
-        floatip_vip = floatingip['floating_ip_address']
-        self.addCleanup(self._delete_floatingip, floatingip['id'])
-
-        LOG.debug('Floating ip %s created.', floatip_vip)
-
-        self.floatingip_client.update_floatingip(
-            floatingip['id'],
-            port_id=self.vip_port
-        )
-
-        LOG.debug('Floating ip %s associated with vip.', floatip_vip)
-        return floatip_vip
-
-    def create_backend(self):
-        if CONF.loadbalancer.premade_server_ip:
-            self.vm_ip = CONF.loadbalancer.premade_server_ip
-            return
-
-        vr_resources = self.vr.resources
-        vm = server_util.create_server(
-            self.os_roles_lbmember,
-            validatable=True,
-            validation_resources=vr_resources,
-            wait_until='ACTIVE',
-            tenant_network=({'id': self.member_network_id}
-                            if self.member_network_id else None),
-        )
-        self.addCleanup(
-            server_util.clear_server,
-            self.os_roles_lbmember.servers_client,
-            vm['id']
-        )
-
-        # Get vm private ip address.
-        ifaces = self.interfaces_client.list_interfaces(vm['id'])
-        for iface in ifaces['interfaceAttachments']:
-            if not self.member_network_id or (iface['net_id'] ==
-                                              self.vip_network_id):
-                for ip_info in iface['fixed_ips']:
-                    if not self.vip_subnet_id or (ip_info['subnet_id'] ==
-                                                  self.vip_subnet_id):
-                        self.vm_ip = ip_info['ip_address']
-                        break
-            if self.vm_ip:
-                break
-
-        self.assertIsNotNone(self.vm_ip)
-
-        if CONF.validation.connect_method == 'floating':
-            connect_ip = vr_resources['floating_ip']['floating_ip_address']
-        else:
-            connect_ip = self.vm_ip
-
-        server_util.run_webserver(
-            connect_ip,
-            vr_resources['keypair']['private_key']
-        )
-        LOG.debug('Web servers are running inside %s', vm['id'])
diff --git a/octavia_tempest_plugin/tests/v2/scenario/__init__.py b/octavia_tempest_plugin/tests/v2/scenario/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/octavia_tempest_plugin/tests/v2/scenario/__init__.py
+++ /dev/null
diff --git a/octavia_tempest_plugin/tests/v2/scenario/test_basic_ops.py b/octavia_tempest_plugin/tests/v2/scenario/test_basic_ops.py
deleted file mode 100644
index 25d16ff..0000000
--- a/octavia_tempest_plugin/tests/v2/scenario/test_basic_ops.py
+++ /dev/null
@@ -1,92 +0,0 @@
-# Copyright 2017 Catalyst IT Ltd
-#
-#   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.
-from oslo_log import log as logging
-
-from tempest import config
-from tempest.lib.common import validation_resources as vr
-from tempest.lib import decorators
-
-from octavia_tempest_plugin.tests.v2 import base
-
-LOG = logging.getLogger(__name__)
-CONF = config.CONF
-
-
-class BasicOpsTest(base.BaseLoadbalancerTest):
-    name_prefix = 'Tempest-BasicOpsTest'
-
-    def setUp(self):
-        super(BasicOpsTest, self).setUp()
-
-        # Setup network resources for instance
-        resources = dict(
-            keypair=True,
-            security_group=True,
-            security_group_rules=True,
-            floating_ip=CONF.validation.connect_method == 'floating'
-        )
-        self.vr = self.useFixture(
-            vr.ValidationResourcesFixture(
-                self.os_roles_lbmember,
-                use_neutron=True,
-                floating_network_id=CONF.network.public_network_id,
-                **resources
-            )
-        )
-
-        # Add security group rule to allow http request
-        self.sg_rule_client.create_security_group_rule(
-            security_group_id=self.vr.resources['security_group']['id'],
-            protocol='tcp',
-            ethertype='IPv4',
-            port_range_min=80,
-            port_range_max=81,
-            direction='ingress'
-        )
-
-        self.create_backend()
-
-    @decorators.idempotent_id('250ebc41-645e-43fb-a79a-e3035f338e2a')
-    @decorators.attr(type='slow')
-    def test_basic_ops(self):
-        # Create loadbalancer
-        params = {}
-        if self.vip_network_id:
-            params['vip_network_id'] = self.vip_network_id
-        if self.vip_subnet_id:
-            params['vip_subnet_id'] = self.vip_subnet_id
-
-        self.create_loadbalancer(**params)
-
-        # Create pool
-        pool = self.create_pool(self.lb_id)
-        self.pool_id = pool['id']
-
-        # Create listener
-        params = {'default_pool_id': self.pool_id}
-        listener = self.create_listener(self.lb_id, **params)
-        self.listener_id = listener['id']
-
-        # Add members to the pool
-        for port in [80, 81]:
-            params = {
-                'address': self.vm_ip,
-                'protocol_port': port,
-            }
-            if self.member_subnet_id:
-                params['subnet_id'] = self.member_subnet_id
-
-            self.create_member(self.pool_id, self.lb_id, **params)
-
-        self.check_members_balanced()
diff --git a/setup.cfg b/setup.cfg
index b452614..993c4f7 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -18,10 +18,6 @@
     Programming Language :: Python :: 3
     Programming Language :: Python :: 3.5
 
-[global]
-setup-hooks =
-    pbr.hooks.setup_hook
-
 [files]
 packages =
     octavia_tempest_plugin
@@ -52,7 +48,3 @@
 all_files = 1
 build-dir = releasenotes/build
 source-dir = releasenotes/source
-
-[entry_points]
-tempest.test_plugins =
-    octavia-tempest-plugin = octavia_tempest_plugin.plugin:OctaviaTempestPlugin
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
deleted file mode 100644
index e7db7ce..0000000
--- a/zuul.d/projects.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-# Note: Some official OpenStack wide jobs are still defined in the
-#       project-config repository
-- project:
-    check:
-      jobs:
-        - octavia-v2-dsvm-scenario
-        - octavia-v2-dsvm-py35-scenario
-    gate:
-      queue: octavia
-      jobs:
-        - octavia-v2-dsvm-scenario
-        - octavia-v2-dsvm-py35-scenario
