blob: 1ccb6ac431d52840dacfa25d6d1ac9955034b6ba [file] [log] [blame]
YAMAMOTO Takashi25935722017-01-23 15:34:11 +09001# Copyright (c) 2017 Midokura SARL
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16import netaddr
17from tempest.common import waiters
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090018from tempest.lib.common.utils import data_utils
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +000019from tempest.lib import decorators
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090020from tempest import test
21import testscenarios
22
Jakub Libosvar7c58cb22017-05-03 09:00:14 +000023from neutron.tests.tempest.common import ssh
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090024from neutron.tests.tempest import config
25from neutron.tests.tempest.scenario import base
26from neutron.tests.tempest.scenario import constants
27
28
29CONF = config.CONF
30
31
32load_tests = testscenarios.load_tests_apply_scenarios
33
34
35class FloatingIpTestCasesMixin(object):
36 credentials = ['primary', 'admin']
37
38 @classmethod
39 @test.requires_ext(extension="router", service="network")
40 def resource_setup(cls):
41 super(FloatingIpTestCasesMixin, cls).resource_setup()
42 cls.network = cls.create_network()
43 cls.subnet = cls.create_subnet(cls.network)
44 cls.router = cls.create_router_by_client()
45 cls.create_router_interface(cls.router['id'], cls.subnet['id'])
46 cls.keypair = cls.create_keypair()
47
48 cls.secgroup = cls.manager.network_client.create_security_group(
49 name=data_utils.rand_name('secgroup-'))['security_group']
50 cls.security_groups.append(cls.secgroup)
51 cls.create_loginable_secgroup_rule(secgroup_id=cls.secgroup['id'])
52 cls.create_pingable_secgroup_rule(secgroup_id=cls.secgroup['id'])
53
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090054 if cls.same_network:
55 cls._dest_network = cls.network
56 else:
57 cls._dest_network = cls._create_dest_network()
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090058
59 @classmethod
60 def _create_dest_network(cls):
61 network = cls.create_network()
62 subnet = cls.create_subnet(network,
63 cidr=netaddr.IPNetwork('10.10.0.0/24'))
64 cls.create_router_interface(cls.router['id'], subnet['id'])
65 return network
66
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000067 def _create_server(self, create_floating_ip=True, network=None):
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090068 if network is None:
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000069 network = self.network
70 port = self.create_port(network, security_groups=[self.secgroup['id']])
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090071 if create_floating_ip:
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000072 fip = self.create_and_associate_floatingip(port['id'])
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090073 else:
74 fip = None
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000075 server = self.create_server(
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090076 flavor_ref=CONF.compute.flavor_ref,
77 image_ref=CONF.compute.image_ref,
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000078 key_name=self.keypair['name'],
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090079 networks=[{'port': port['id']}])['server']
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000080 waiters.wait_for_server_status(self.manager.servers_client,
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090081 server['id'],
82 constants.SERVER_STATUS_ACTIVE)
83 return {'port': port, 'fip': fip, 'server': server}
84
85 def _test_east_west(self):
86 # Source VM
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000087 server1 = self._create_server()
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090088 server1_ip = server1['fip']['floating_ip_address']
89 ssh_client = ssh.Client(server1_ip,
90 CONF.validation.image_ssh_user,
91 pkey=self.keypair['private_key'])
92
93 # Destination VM
94 if self.dest_has_fip:
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000095 dest_server = self._create_server(network=self._dest_network)
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090096 else:
Genadi Chereshnya918dd0b2017-05-17 13:02:20 +000097 dest_server = self._create_server(create_floating_ip=False,
98 network=self._dest_network)
YAMAMOTO Takashi25935722017-01-23 15:34:11 +090099
100 # Check connectivity
101 self.check_remote_connectivity(ssh_client,
102 dest_server['port']['fixed_ips'][0]['ip_address'])
103 if self.dest_has_fip:
104 self.check_remote_connectivity(ssh_client,
105 dest_server['fip']['floating_ip_address'])
106
107
108class FloatingIpSameNetwork(FloatingIpTestCasesMixin,
109 base.BaseTempestTestCase):
110 # REVISIT(yamamoto): 'SRC without FIP' case is possible?
111 scenarios = [
112 ('DEST with FIP', dict(dest_has_fip=True)),
113 ('DEST without FIP', dict(dest_has_fip=False)),
114 ]
115
116 same_network = True
117
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000118 @decorators.idempotent_id('05c4e3b3-7319-4052-90ad-e8916436c23b')
YAMAMOTO Takashi25935722017-01-23 15:34:11 +0900119 def test_east_west(self):
120 self._test_east_west()
121
122
123class FloatingIpSeparateNetwork(FloatingIpTestCasesMixin,
124 base.BaseTempestTestCase):
125 # REVISIT(yamamoto): 'SRC without FIP' case is possible?
126 scenarios = [
127 ('DEST with FIP', dict(dest_has_fip=True)),
128 ('DEST without FIP', dict(dest_has_fip=False)),
129 ]
130
131 same_network = False
132
Sławek Kapłońskic0caa2e2017-02-25 10:11:32 +0000133 @decorators.idempotent_id('f18f0090-3289-4783-b956-a0f8ac511e8b')
YAMAMOTO Takashi25935722017-01-23 15:34:11 +0900134 def test_east_west(self):
135 self._test_east_west()