blob: cfac25799c11d2178a3542ad5826cb6738d9136e [file] [log] [blame]
Jay Pipesf4dad392012-06-05 16:03:58 -04001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
ZhiQiang Fan39f97222013-09-20 04:49:44 +08003# Copyright 2012 OpenStack Foundation
Jay Pipesf4dad392012-06-05 16:03:58 -04004# 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):
Attila Fazekasf86fa312013-07-30 19:56:39 +020050 super(BaseNetworkTest, cls).setUpClass()
raiesmh0867698322013-08-20 13:09:01 +053051 os = clients.Manager(interface=cls._interface)
Miguel Lavallecc939612013-02-22 17:27:20 -060052 cls.network_cfg = os.config.network
Matthew Treinishfaa340d2013-07-19 16:26:21 -040053 if not cls.config.service_available.neutron:
Mark McClainf2982e82013-07-06 17:48:03 -040054 raise cls.skipException("Neutron support is required")
Miguel Lavallecc939612013-02-22 17:27:20 -060055 cls.client = os.network_client
56 cls.networks = []
57 cls.subnets = []
raiesmh08e1aad982013-08-05 14:19:36 +053058 cls.ports = []
raiesmh080fe76852013-09-13 11:52:56 +053059 cls.pools = []
60 cls.vips = []
raiesmh08f8437ed2013-09-17 10:59:38 +053061 cls.members = []
raiesmh0832580d02013-09-17 13:11:34 +053062 cls.health_monitors = []
Jay Pipesf4dad392012-06-05 16:03:58 -040063
64 @classmethod
65 def tearDownClass(cls):
raiesmh0832580d02013-09-17 13:11:34 +053066 for health_monitor in cls.health_monitors:
67 cls.client.delete_health_monitor(health_monitor['id'])
raiesmh08f8437ed2013-09-17 10:59:38 +053068 for member in cls.members:
69 cls.client.delete_member(member['id'])
raiesmh080fe76852013-09-13 11:52:56 +053070 for vip in cls.vips:
71 cls.client.delete_vip(vip['id'])
72 for pool in cls.pools:
73 cls.client.delete_pool(pool['id'])
raiesmh08e1aad982013-08-05 14:19:36 +053074 for port in cls.ports:
75 cls.client.delete_port(port['id'])
Miguel Lavallecc939612013-02-22 17:27:20 -060076 for subnet in cls.subnets:
77 cls.client.delete_subnet(subnet['id'])
Jay Pipesf4dad392012-06-05 16:03:58 -040078 for network in cls.networks:
79 cls.client.delete_network(network['id'])
Attila Fazekasf86fa312013-07-30 19:56:39 +020080 super(BaseNetworkTest, cls).tearDownClass()
Jay Pipesf4dad392012-06-05 16:03:58 -040081
Miguel Lavallecc939612013-02-22 17:27:20 -060082 @classmethod
83 def create_network(cls, network_name=None):
Sean Daguef237ccb2013-01-04 15:19:14 -050084 """Wrapper utility that returns a test network."""
Miguel Lavallecc939612013-02-22 17:27:20 -060085 network_name = network_name or rand_name('test-network-')
Jay Pipesf4dad392012-06-05 16:03:58 -040086
Miguel Lavallecc939612013-02-22 17:27:20 -060087 resp, body = cls.client.create_network(network_name)
Jay Pipesf4dad392012-06-05 16:03:58 -040088 network = body['network']
Miguel Lavallecc939612013-02-22 17:27:20 -060089 cls.networks.append(network)
Jay Pipesf4dad392012-06-05 16:03:58 -040090 return network
Miguel Lavallecc939612013-02-22 17:27:20 -060091
92 @classmethod
93 def create_subnet(cls, network):
94 """Wrapper utility that returns a test subnet."""
95 cidr = netaddr.IPNetwork(cls.network_cfg.tenant_network_cidr)
96 mask_bits = cls.network_cfg.tenant_network_mask_bits
97 # Find a cidr that is not in use yet and create a subnet with it
Matt Riedemann9c9fa412013-06-19 18:33:47 -070098 body = None
Matt Riedemannd052c572013-05-31 17:10:11 -070099 failure = None
Miguel Lavallecc939612013-02-22 17:27:20 -0600100 for subnet_cidr in cidr.subnet(mask_bits):
101 try:
102 resp, body = cls.client.create_subnet(network['id'],
103 str(subnet_cidr))
104 break
105 except exceptions.BadRequest as e:
106 is_overlapping_cidr = 'overlaps with another subnet' in str(e)
107 if not is_overlapping_cidr:
108 raise
Matt Riedemannd052c572013-05-31 17:10:11 -0700109 # save the failure in case all of the CIDRs are overlapping
110 failure = e
111
112 if not body and failure:
113 raise failure
114
Miguel Lavallecc939612013-02-22 17:27:20 -0600115 subnet = body['subnet']
116 cls.subnets.append(subnet)
117 return subnet
raiesmh08e1aad982013-08-05 14:19:36 +0530118
119 @classmethod
120 def create_port(cls, network):
121 """Wrapper utility that returns a test port."""
122 resp, body = cls.client.create_port(network['id'])
123 port = body['port']
124 cls.ports.append(port)
125 return port
raiesmh080fe76852013-09-13 11:52:56 +0530126
127 @classmethod
128 def create_pool(cls, name, lb_method, protocol, subnet):
129 """Wrapper utility that returns a test pool."""
130 resp, body = cls.client.create_pool(name, lb_method, protocol,
131 subnet['id'])
132 pool = body['pool']
133 cls.pools.append(pool)
134 return pool
135
136 @classmethod
137 def create_vip(cls, name, protocol, protocol_port, subnet, pool):
138 """Wrapper utility that returns a test vip."""
139 resp, body = cls.client.create_vip(name, protocol, protocol_port,
140 subnet['id'], pool['id'])
141 vip = body['vip']
142 cls.vips.append(vip)
143 return vip
raiesmh08f8437ed2013-09-17 10:59:38 +0530144
145 @classmethod
146 def create_member(cls, protocol_port, pool):
147 """Wrapper utility that returns a test member."""
148 resp, body = cls.client.create_member("10.0.9.46",
149 protocol_port,
150 pool['id'])
151 member = body['member']
152 cls.members.append(member)
153 return member
raiesmh0832580d02013-09-17 13:11:34 +0530154
155 @classmethod
156 def create_health_monitor(cls, delay, max_retries, Type, timeout):
157 """Wrapper utility that returns a test health monitor."""
158 resp, body = cls.client.create_health_monitor(delay,
159 max_retries,
160 Type, timeout)
161 health_monitor = body['health_monitor']
162 cls.health_monitors.append(health_monitor)
163 return health_monitor