blob: d3fa7635107ee34026b7ece03d0360e17581632d [file] [log] [blame]
Jay Pipesf4dad392012-06-05 16:03:58 -04001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2012 OpenStack, LLC
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
Miguel Lavallecc939612013-02-22 17:27:20 -060018import netaddr
Jay Pipesf4dad392012-06-05 16:03:58 -040019
Matthew Treinish481466b2012-12-20 17:16:01 -050020from tempest import clients
Matthew Treinisha83a16e2012-12-07 13:44:02 -050021from tempest.common.utils.data_utils import rand_name
Miguel Lavallecc939612013-02-22 17:27:20 -060022from tempest import exceptions
Attila Fazekasdc216422013-01-29 15:12:14 +010023import tempest.test
Jay Pipesf4dad392012-06-05 16:03:58 -040024
25
Attila Fazekasdc216422013-01-29 15:12:14 +010026class BaseNetworkTest(tempest.test.BaseTestCase):
Jay Pipesf4dad392012-06-05 16:03:58 -040027
Miguel Lavallecc939612013-02-22 17:27:20 -060028 """
Mark McClainf2982e82013-07-06 17:48:03 -040029 Base class for the Neutron tests that use the Tempest Neutron REST client
Miguel Lavallecc939612013-02-22 17:27:20 -060030
Mark McClainf2982e82013-07-06 17:48:03 -040031 Per the Neutron API Guide, API v1.x was removed from the source code tree
Miguel Lavallecc939612013-02-22 17:27:20 -060032 (docs.openstack.org/api/openstack-network/2.0/content/Overview-d1e71.html)
Mark McClainf2982e82013-07-06 17:48:03 -040033 Therefore, v2.x of the Neutron API is assumed. It is also assumed that the
Miguel Lavallecc939612013-02-22 17:27:20 -060034 following options are defined in the [network] section of etc/tempest.conf:
35
36 tenant_network_cidr with a block of cidr's from which smaller blocks
37 can be allocated for tenant networks
38
39 tenant_network_mask_bits with the mask bits to be used to partition the
40 block defined by tenant-network_cidr
Miguel Lavalle2492d782013-06-16 15:04:15 -050041
42 Finally, it is assumed that the following option is defined in the
43 [service_available] section of etc/tempest.conf
44
45 neutron as True
Miguel Lavallecc939612013-02-22 17:27:20 -060046 """
47
Jay Pipesf4dad392012-06-05 16:03:58 -040048 @classmethod
49 def setUpClass(cls):
Matthew Treinish481466b2012-12-20 17:16:01 -050050 os = clients.Manager()
Miguel Lavallecc939612013-02-22 17:27:20 -060051 cls.network_cfg = os.config.network
Matthew Treinishfaa340d2013-07-19 16:26:21 -040052 if not cls.config.service_available.neutron:
Mark McClainf2982e82013-07-06 17:48:03 -040053 raise cls.skipException("Neutron support is required")
Miguel Lavallecc939612013-02-22 17:27:20 -060054 cls.client = os.network_client
55 cls.networks = []
56 cls.subnets = []
raiesmh08e1aad982013-08-05 14:19:36 +053057 cls.ports = []
Jay Pipesf4dad392012-06-05 16:03:58 -040058
59 @classmethod
60 def tearDownClass(cls):
raiesmh08e1aad982013-08-05 14:19:36 +053061 for port in cls.ports:
62 cls.client.delete_port(port['id'])
Miguel Lavallecc939612013-02-22 17:27:20 -060063 for subnet in cls.subnets:
64 cls.client.delete_subnet(subnet['id'])
Jay Pipesf4dad392012-06-05 16:03:58 -040065 for network in cls.networks:
66 cls.client.delete_network(network['id'])
67
Miguel Lavallecc939612013-02-22 17:27:20 -060068 @classmethod
69 def create_network(cls, network_name=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050070 """Wrapper utility that returns a test network."""
Miguel Lavallecc939612013-02-22 17:27:20 -060071 network_name = network_name or rand_name('test-network-')
Jay Pipesf4dad392012-06-05 16:03:58 -040072
Miguel Lavallecc939612013-02-22 17:27:20 -060073 resp, body = cls.client.create_network(network_name)
Jay Pipesf4dad392012-06-05 16:03:58 -040074 network = body['network']
Miguel Lavallecc939612013-02-22 17:27:20 -060075 cls.networks.append(network)
Jay Pipesf4dad392012-06-05 16:03:58 -040076 return network
Miguel Lavallecc939612013-02-22 17:27:20 -060077
78 @classmethod
79 def create_subnet(cls, network):
80 """Wrapper utility that returns a test subnet."""
81 cidr = netaddr.IPNetwork(cls.network_cfg.tenant_network_cidr)
82 mask_bits = cls.network_cfg.tenant_network_mask_bits
83 # Find a cidr that is not in use yet and create a subnet with it
Matt Riedemann9c9fa412013-06-19 18:33:47 -070084 body = None
Matt Riedemannd052c572013-05-31 17:10:11 -070085 failure = None
Miguel Lavallecc939612013-02-22 17:27:20 -060086 for subnet_cidr in cidr.subnet(mask_bits):
87 try:
88 resp, body = cls.client.create_subnet(network['id'],
89 str(subnet_cidr))
90 break
91 except exceptions.BadRequest as e:
92 is_overlapping_cidr = 'overlaps with another subnet' in str(e)
93 if not is_overlapping_cidr:
94 raise
Matt Riedemannd052c572013-05-31 17:10:11 -070095 # save the failure in case all of the CIDRs are overlapping
96 failure = e
97
98 if not body and failure:
99 raise failure
100
Miguel Lavallecc939612013-02-22 17:27:20 -0600101 subnet = body['subnet']
102 cls.subnets.append(subnet)
103 return subnet
raiesmh08e1aad982013-08-05 14:19:36 +0530104
105 @classmethod
106 def create_port(cls, network):
107 """Wrapper utility that returns a test port."""
108 resp, body = cls.client.create_port(network['id'])
109 port = body['port']
110 cls.ports.append(port)
111 return port