Fix the config.yaml including for each testcase
[sdnvpn.git] / sdnvpn / test / functest / testcase_4.py
1 #!/usr/bin/python
2 #
3 # Copyright (c) 2017 All rights reserved
4 # This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10
11 import logging
12 import sys
13
14 from functest.utils import openstack_utils as os_utils
15 from random import randint
16 from sdnvpn.lib import config as sdnvpn_config
17 from sdnvpn.lib import utils as test_utils
18 from sdnvpn.lib.results import Results
19
20
21 logger = logging.getLogger(__name__)
22
23 COMMON_CONFIG = sdnvpn_config.CommonConfig()
24 TESTCASE_CONFIG = sdnvpn_config.TestcaseConfig(
25     'sdnvpn.test.functest.testcase_4')
26
27
28 def main():
29     results = Results(COMMON_CONFIG.line_length)
30
31     results.add_to_summary(0, "=")
32     results.add_to_summary(2, "STATUS", "SUBTEST")
33     results.add_to_summary(0, "=")
34
35     nova_client = os_utils.get_nova_client()
36     neutron_client = os_utils.get_neutron_client()
37     glance_client = os_utils.get_glance_client()
38
39     (floatingip_ids, instance_ids, router_ids, network_ids, image_ids,
40      subnet_ids, interfaces, bgpvpn_ids) = ([] for i in range(8))
41
42     image_id = os_utils.create_glance_image(glance_client,
43                                             TESTCASE_CONFIG.image_name,
44                                             COMMON_CONFIG.image_path,
45                                             disk=COMMON_CONFIG.image_format,
46                                             container="bare",
47                                             public='public')
48     image_ids.append(image_id)
49
50     network_1_id, subnet_1_id, router_1_id = test_utils.create_network(
51         neutron_client,
52         TESTCASE_CONFIG.net_1_name,
53         TESTCASE_CONFIG.subnet_1_name,
54         TESTCASE_CONFIG.subnet_1_cidr,
55         TESTCASE_CONFIG.router_1_name)
56
57     network_2_id = test_utils.create_net(
58         neutron_client,
59         TESTCASE_CONFIG.net_2_name)
60
61     subnet_2_id = test_utils.create_subnet(
62         neutron_client,
63         TESTCASE_CONFIG.subnet_2_name,
64         TESTCASE_CONFIG.subnet_2_cidr,
65         network_2_id)
66     interfaces.append(tuple((router_1_id, subnet_1_id)))
67     network_ids.extend([network_1_id, network_2_id])
68     router_ids.append(router_1_id)
69     subnet_ids.extend([subnet_1_id, subnet_2_id])
70
71     sg_id = os_utils.create_security_group_full(
72         neutron_client,
73         TESTCASE_CONFIG.secgroup_name,
74         TESTCASE_CONFIG.secgroup_descr)
75
76     compute_nodes = test_utils.assert_and_get_compute_nodes(nova_client)
77
78     av_zone_1 = "nova:" + compute_nodes[0]
79     av_zone_2 = "nova:" + compute_nodes[1]
80
81     # boot INTANCES
82     vm_2 = test_utils.create_instance(
83         nova_client,
84         TESTCASE_CONFIG.instance_2_name,
85         image_id,
86         network_1_id,
87         sg_id,
88         secgroup_name=TESTCASE_CONFIG.secgroup_name,
89         compute_node=av_zone_1)
90     vm_2_ip = test_utils.get_instance_ip(vm_2)
91
92     vm_3 = test_utils.create_instance(
93         nova_client,
94         TESTCASE_CONFIG.instance_3_name,
95         image_id,
96         network_1_id,
97         sg_id,
98         secgroup_name=TESTCASE_CONFIG.secgroup_name,
99         compute_node=av_zone_2)
100     vm_3_ip = test_utils.get_instance_ip(vm_3)
101
102     vm_5 = test_utils.create_instance(
103         nova_client,
104         TESTCASE_CONFIG.instance_5_name,
105         image_id,
106         network_2_id,
107         sg_id,
108         secgroup_name=TESTCASE_CONFIG.secgroup_name,
109         compute_node=av_zone_2)
110     vm_5_ip = test_utils.get_instance_ip(vm_5)
111
112     # We boot vm5 first because we need vm5_ip for vm4 userdata
113     u4 = test_utils.generate_ping_userdata([vm_5_ip])
114     vm_4 = test_utils.create_instance(
115         nova_client,
116         TESTCASE_CONFIG.instance_4_name,
117         image_id,
118         network_2_id,
119         sg_id,
120         secgroup_name=TESTCASE_CONFIG.secgroup_name,
121         compute_node=av_zone_1,
122         userdata=u4)
123     vm_4_ip = test_utils.get_instance_ip(vm_4)
124
125     # We boot VM1 at the end because we need to get the IPs first to generate
126     # the userdata
127     u1 = test_utils.generate_ping_userdata([vm_2_ip,
128                                             vm_3_ip,
129                                             vm_4_ip,
130                                             vm_5_ip])
131     vm_1 = test_utils.create_instance(
132         nova_client,
133         TESTCASE_CONFIG.instance_1_name,
134         image_id,
135         network_1_id,
136         sg_id,
137         secgroup_name=TESTCASE_CONFIG.secgroup_name,
138         compute_node=av_zone_1,
139         userdata=u1)
140
141     instance_ids.extend([vm_1.id, vm_2.id, vm_3.id, vm_4.id, vm_5.id])
142
143     msg = ("Create VPN with eRT<>iRT")
144     results.record_action(msg)
145     vpn_name = "sdnvpn-" + str(randint(100000, 999999))
146     kwargs = {"import_targets": TESTCASE_CONFIG.targets1,
147               "export_targets": TESTCASE_CONFIG.targets2,
148               "route_distinguishers": TESTCASE_CONFIG.route_distinguishers,
149               "name": vpn_name}
150     bgpvpn = test_utils.create_bgpvpn(neutron_client, **kwargs)
151     bgpvpn_id = bgpvpn['bgpvpn']['id']
152     logger.debug("VPN created details: %s" % bgpvpn)
153     bgpvpn_ids.append(bgpvpn_id)
154
155     msg = ("Associate router '%s' to the VPN." % TESTCASE_CONFIG.router_1_name)
156     results.record_action(msg)
157     results.add_to_summary(0, "-")
158
159     test_utils.create_router_association(
160         neutron_client, bgpvpn_id, router_1_id)
161
162     # Wait for VMs to get ips.
163     instances_up = test_utils.wait_for_instances_up(vm_1, vm_2,
164                                                     vm_3, vm_4,
165                                                     vm_5)
166
167     if not instances_up:
168         logger.error("One or more instances is down")
169         # TODO Handle appropriately
170
171     results.get_ping_status(vm_1, vm_2, expected="PASS", timeout=200)
172     results.get_ping_status(vm_1, vm_3, expected="PASS", timeout=30)
173     results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30)
174
175     msg = ("Associate network '%s' to the VPN." % TESTCASE_CONFIG.net_2_name)
176     results.add_to_summary(0, "-")
177     results.record_action(msg)
178     results.add_to_summary(0, "-")
179     test_utils.create_network_association(
180         neutron_client, bgpvpn_id, network_2_id)
181
182     test_utils.wait_for_bgp_router_assoc(
183         neutron_client, bgpvpn_id, router_1_id)
184     test_utils.wait_for_bgp_net_assoc(
185         neutron_client, bgpvpn_id, network_2_id)
186
187     logger.info("Waiting for the VMs to connect to each other using the"
188                 " updated network configuration")
189     test_utils.wait_before_subtest()
190
191     results.get_ping_status(vm_4, vm_5, expected="PASS", timeout=30)
192     # TODO enable again when isolation in VPN with iRT != eRT works
193     # results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30)
194     # results.get_ping_status(vm_1, vm_5, expected="FAIL", timeout=30)
195
196     msg = ("Update VPN with eRT=iRT ...")
197     results.add_to_summary(0, "-")
198     results.record_action(msg)
199     results.add_to_summary(0, "-")
200     kwargs = {"import_targets": TESTCASE_CONFIG.targets1,
201               "export_targets": TESTCASE_CONFIG.targets1,
202               "name": vpn_name}
203     bgpvpn = test_utils.update_bgpvpn(neutron_client, bgpvpn_id, **kwargs)
204
205     logger.info("Waiting for the VMs to connect to each other using the"
206                 " updated network configuration")
207     test_utils.wait_before_subtest()
208
209     results.get_ping_status(vm_1, vm_4, expected="PASS", timeout=30)
210     results.get_ping_status(vm_1, vm_5, expected="PASS", timeout=30)
211
212     results.add_to_summary(0, "=")
213     logger.info("\n%s" % results.summary)
214
215     test_utils.cleanup_nova(nova_client, instance_ids, image_ids)
216     test_utils.cleanup_neutron(neutron_client, floatingip_ids, bgpvpn_ids,
217                                interfaces, subnet_ids, router_ids,
218                                network_ids)
219     return results.compile_summary()
220
221
222 if __name__ == '__main__':
223     logging.basicConfig(level=logging.INFO)
224     sys.exit(main())