Fix instance boot when metadata exists
[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     try:
43         image_id = os_utils.create_glance_image(
44             glance_client, TESTCASE_CONFIG.image_name,
45             COMMON_CONFIG.image_path, disk=COMMON_CONFIG.image_format,
46             container="bare", public='public')
47         image_ids.append(image_id)
48
49         network_1_id, subnet_1_id, router_1_id = test_utils.create_network(
50             neutron_client,
51             TESTCASE_CONFIG.net_1_name,
52             TESTCASE_CONFIG.subnet_1_name,
53             TESTCASE_CONFIG.subnet_1_cidr,
54             TESTCASE_CONFIG.router_1_name)
55
56         network_2_id = test_utils.create_net(
57             neutron_client,
58             TESTCASE_CONFIG.net_2_name)
59
60         subnet_2_id = test_utils.create_subnet(
61             neutron_client,
62             TESTCASE_CONFIG.subnet_2_name,
63             TESTCASE_CONFIG.subnet_2_cidr,
64             network_2_id)
65         interfaces.append(tuple((router_1_id, subnet_1_id)))
66         network_ids.extend([network_1_id, network_2_id])
67         router_ids.append(router_1_id)
68         subnet_ids.extend([subnet_1_id, subnet_2_id])
69
70         sg_id = os_utils.create_security_group_full(
71             neutron_client,
72             TESTCASE_CONFIG.secgroup_name,
73             TESTCASE_CONFIG.secgroup_descr)
74
75         compute_nodes = test_utils.assert_and_get_compute_nodes(nova_client)
76
77         av_zone_1 = "nova:" + compute_nodes[0]
78         av_zone_2 = "nova:" + compute_nodes[1]
79
80         # boot INTANCES
81         vm_2 = test_utils.create_instance(
82             nova_client,
83             TESTCASE_CONFIG.instance_2_name,
84             image_id,
85             network_1_id,
86             sg_id,
87             secgroup_name=TESTCASE_CONFIG.secgroup_name,
88             compute_node=av_zone_1)
89         vm_2_ip = test_utils.get_instance_ip(vm_2)
90
91         vm_3 = test_utils.create_instance(
92             nova_client,
93             TESTCASE_CONFIG.instance_3_name,
94             image_id,
95             network_1_id,
96             sg_id,
97             secgroup_name=TESTCASE_CONFIG.secgroup_name,
98             compute_node=av_zone_2)
99         vm_3_ip = test_utils.get_instance_ip(vm_3)
100
101         vm_5 = test_utils.create_instance(
102             nova_client,
103             TESTCASE_CONFIG.instance_5_name,
104             image_id,
105             network_2_id,
106             sg_id,
107             secgroup_name=TESTCASE_CONFIG.secgroup_name,
108             compute_node=av_zone_2)
109         vm_5_ip = test_utils.get_instance_ip(vm_5)
110
111         # We boot vm5 first because we need vm5_ip for vm4 userdata
112         u4 = test_utils.generate_ping_userdata([vm_5_ip])
113         vm_4 = test_utils.create_instance(
114             nova_client,
115             TESTCASE_CONFIG.instance_4_name,
116             image_id,
117             network_2_id,
118             sg_id,
119             secgroup_name=TESTCASE_CONFIG.secgroup_name,
120             compute_node=av_zone_1,
121             userdata=u4)
122         vm_4_ip = test_utils.get_instance_ip(vm_4)
123
124         # We boot VM1 at the end because we need to get the IPs
125         # first to generate the userdata
126         u1 = test_utils.generate_ping_userdata([vm_2_ip,
127                                                 vm_3_ip,
128                                                 vm_4_ip,
129                                                 vm_5_ip])
130         vm_1 = test_utils.create_instance(
131             nova_client,
132             TESTCASE_CONFIG.instance_1_name,
133             image_id,
134             network_1_id,
135             sg_id,
136             secgroup_name=TESTCASE_CONFIG.secgroup_name,
137             compute_node=av_zone_1,
138             userdata=u1)
139
140         instance_ids.extend([vm_1.id, vm_2.id, vm_3.id, vm_4.id, vm_5.id])
141
142         msg = ("Create VPN with eRT<>iRT")
143         results.record_action(msg)
144         vpn_name = "sdnvpn-" + str(randint(100000, 999999))
145         kwargs = {
146             "import_targets": TESTCASE_CONFIG.targets1,
147             "export_targets": TESTCASE_CONFIG.targets2,
148             "route_distinguishers": TESTCASE_CONFIG.route_distinguishers,
149             "name": vpn_name
150         }
151         bgpvpn = test_utils.create_bgpvpn(neutron_client, **kwargs)
152         bgpvpn_id = bgpvpn['bgpvpn']['id']
153         logger.debug("VPN created details: %s" % bgpvpn)
154         bgpvpn_ids.append(bgpvpn_id)
155
156         msg = ("Associate router '%s' to the VPN." %
157                TESTCASE_CONFIG.router_1_name)
158         results.record_action(msg)
159         results.add_to_summary(0, "-")
160
161         test_utils.create_router_association(
162             neutron_client, bgpvpn_id, router_1_id)
163
164         # Wait for VMs to get ips.
165         instances_up = test_utils.wait_for_instances_up(vm_2, vm_3, vm_5)
166         instances_dhcp_up = test_utils.wait_for_instances_get_dhcp(vm_1, vm_4)
167
168         if (not instances_up or not instances_dhcp_up):
169             logger.error("One or more instances are down")
170             # TODO: Handle this appropriately
171
172         results.get_ping_status(vm_1, vm_2, expected="PASS", timeout=200)
173         results.get_ping_status(vm_1, vm_3, expected="PASS", timeout=30)
174         results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30)
175
176         msg = ("Associate network '%s' to the VPN." %
177                TESTCASE_CONFIG.net_2_name)
178         results.add_to_summary(0, "-")
179         results.record_action(msg)
180         results.add_to_summary(0, "-")
181         test_utils.create_network_association(
182             neutron_client, bgpvpn_id, network_2_id)
183
184         test_utils.wait_for_bgp_router_assoc(
185             neutron_client, bgpvpn_id, router_1_id)
186         test_utils.wait_for_bgp_net_assoc(
187             neutron_client, bgpvpn_id, network_2_id)
188
189         logger.info("Waiting for the VMs to connect to each other using the"
190                     " updated network configuration")
191         test_utils.wait_before_subtest()
192
193         results.get_ping_status(vm_4, vm_5, expected="PASS", timeout=30)
194         # TODO enable again when isolation in VPN with iRT != eRT works
195         # results.get_ping_status(vm_1, vm_4, expected="FAIL", timeout=30)
196         # results.get_ping_status(vm_1, vm_5, expected="FAIL", timeout=30)
197
198         msg = ("Update VPN with eRT=iRT ...")
199         results.add_to_summary(0, "-")
200         results.record_action(msg)
201         results.add_to_summary(0, "-")
202         kwargs = {"import_targets": TESTCASE_CONFIG.targets1,
203                   "export_targets": TESTCASE_CONFIG.targets1,
204                   "name": vpn_name}
205         bgpvpn = test_utils.update_bgpvpn(neutron_client,
206                                           bgpvpn_id, **kwargs)
207
208         logger.info("Waiting for the VMs to connect to each other using the"
209                     " updated network configuration")
210         test_utils.wait_before_subtest()
211
212         results.get_ping_status(vm_1, vm_4, expected="PASS", timeout=30)
213         results.get_ping_status(vm_1, vm_5, expected="PASS", timeout=30)
214
215         results.add_to_summary(0, "=")
216         logger.info("\n%s" % results.summary)
217
218     except Exception as e:
219         logger.error("exception occurred while executing testcase_4: %s", e)
220         raise
221     finally:
222         test_utils.cleanup_nova(nova_client, instance_ids, image_ids)
223         test_utils.cleanup_neutron(neutron_client, floatingip_ids,
224                                    bgpvpn_ids, interfaces, subnet_ids,
225                                    router_ids, network_ids)
226
227     return results.compile_summary()
228
229
230 if __name__ == '__main__':
231     logging.basicConfig(level=logging.INFO)
232     sys.exit(main())