diff --git a/tests/restapi/restapi_operations.py b/tests/restapi/restapi_operations.py index cebe5ad78e8..b8bfff50ea6 100644 --- a/tests/restapi/restapi_operations.py +++ b/tests/restapi/restapi_operations.py @@ -8,6 +8,7 @@ API_VERSION = 'v1' GET = 'GET' POST = 'POST' +DELETE = 'DELETE' PATCH = 'PATCH' class Restapi: @@ -23,6 +24,8 @@ def request(self, method, url, params=None): req = requests.Request(GET, url) elif method == POST: req = requests.Request(POST, url, data=params) + elif method == DELETE: + req = requests.Request(DELETE, url, data=params) elif method == PATCH: req = requests.Request(PATCH, url, data=params) req_p = req.prepare() @@ -61,6 +64,14 @@ def get_config_vrouter_vrf_id(self, construct_url, vrf_id): return self.request(GET, url) else: logger.error("Malformed URL for "+path+"!") + + def delete_config_vrouter_vrf_id(self, construct_url, vrf_id, params): + path = API_VERSION+'/config/vrouter/{vrf_id}'.format(vrf_id=vrf_id) + url = construct_url(path) + if url: + return self.request(DELETE, url, params) + else: + logger.error("Malformed URL for "+path+"!") # Vlan def post_config_vlan(self, construct_url, vlan_id, params): @@ -77,7 +88,15 @@ def get_config_vlan(self, construct_url, vlan_id): if url: return self.request(GET, url) else: - logger.error("Malformed URL for "+path+"!") + logger.error("Malformed URL for "+path+"!") + + def delete_config_vlan(self, construct_url, vlan_id, params): + path = API_VERSION+'/config/interface/vlan/{vlan_id}'.format(vlan_id=vlan_id) + url = construct_url(path) + if url: + return self.request(DELETE, url, params) + else: + logger.error("Malformed URL for "+path+"!") # Vlan Member def post_config_vlan_member(self, construct_url, vlan_id, if_name, params): @@ -96,6 +115,14 @@ def get_config_vlan_member(self, construct_url, vlan_id, if_name): else: logger.error("Malformed URL for "+path+"!") + def delete_config_vlan_member(self, construct_url, vlan_id, if_name, params): + path = API_VERSION+'/config/interface/vlan/{vlan_id}/member/{if_name}'.format(vlan_id=vlan_id, if_name=if_name) + url = construct_url(path) + if url: + return self.request(DELETE, url, params) + else: + logger.error("Malformed URL for "+path+"!") + # Vlan Neighbor def post_config_vlan_neighbor(self, construct_url, vlan_id, ip_addr, params): path = API_VERSION+'/config/interface/vlan/{vlan_id}/neighbor/{ip_addr}'.format(vlan_id=vlan_id, ip_addr=ip_addr) @@ -113,6 +140,14 @@ def get_config_vlan_neighbor(self, construct_url, vlan_id, ip_addr): else: logger.error("Malformed URL for "+path+"!") + def delete_config_vlan_neighbor(self, construct_url, vlan_id, ip_addr, params): + path = API_VERSION+'/config/interface/vlan/{vlan_id}/neighbor/{ip_addr}'.format(vlan_id=vlan_id, ip_addr=ip_addr) + url = construct_url(path) + if url: + return self.request(DELETE, url, params) + else: + logger.error("Malformed URL for "+path+"!") + # Routes def patch_config_vrouter_vrf_id_routes(self, construct_url, vrf_id, params): path = API_VERSION+'/config/vrouter/{vrf_id}/routes'.format(vrf_id=vrf_id) diff --git a/tests/restapi/test_restapi.py b/tests/restapi/test_restapi.py index 6e8675213e2..a130489d805 100644 --- a/tests/restapi/test_restapi.py +++ b/tests/restapi/test_restapi.py @@ -200,3 +200,183 @@ def test_data_path(construct_url, vlan_members): for route in expected: pytest_assert(route in r.json()) logger.info("Routes with vnid: 3000 to VNET vnet-guid-3 have been added successfully") + + +''' +This test creates a VNET. It adds routes to the VNET and deletes them +''' +def test_create_vrf(construct_url): + ''' + # Create Default VxLan Tunnel + params = '{"ip_addr": "10.3.152.32"}' + logger.info("Creating Default VxLan Tunnel with ip_addr: 10.3.152.32") + r = restapi.post_config_tunnel_decap_tunnel_type(construct_url, 'vxlan', params) + pytest_assert(r.status_code == 204) + ''' + + # Create VNET + params = '{"vnid": 10000}' + logger.info("Creating VNET vnet-guid-10 with vnid: 10000") + r = restapi.post_config_vrouter_vrf_id(construct_url, 'vnet-guid-10', params) + pytest_assert(r.status_code == 204) + + # Verify VNET has been created + r = restapi.get_config_vrouter_vrf_id(construct_url, 'vnet-guid-10') + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = '{"attr": {"vnid": 10000}, "vnet_id": "vnet-guid-10"}' + pytest_assert(r.json() == json.loads(expected)) + logger.info("VNET with vnet_id: vnet-guid-10 has been successfully created with vnid: 10000") + + # Add routes + params = '[{"cmd": "add", "ip_prefix": "10.1.0.1/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "add", "ip_prefix": "10.1.0.2/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "add", "ip_prefix": "10.1.0.3/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "add", "ip_prefix": "10.1.0.4/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "add", "ip_prefix": "10.1.0.5/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}]' + logger.info("Adding routes with vnid: 7039114 to VNET vnet-guid-10") + r = restapi.patch_config_vrouter_vrf_id_routes(construct_url, 'vnet-guid-10', params) + pytest_assert(r.status_code == 204) + + # Verify routes + params = '{}' + r = restapi.get_config_vrouter_vrf_id_routes(construct_url, 'vnet-guid-10', params) + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = [{"nexthop": "100.78.60.37", "ip_prefix": "10.1.0.1/32", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, + {"nexthop": "100.78.60.37", "ip_prefix": "10.1.0.2/32", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, + {"nexthop": "100.78.60.37", "ip_prefix": "10.1.0.3/32", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, + {"nexthop": "100.78.60.37", "ip_prefix": "10.1.0.4/32", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, + {"nexthop": "100.78.60.37", "ip_prefix": "10.1.0.5/32", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}] + for route in expected: + pytest_assert(route in r.json()) + logger.info("Routes with vnid: 7039114 to VNET vnet-guid-10 have been added successfully") + + # Delete routes + params = '[{"cmd": "delete", "ip_prefix": "10.1.0.1/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "delete", "ip_prefix": "10.1.0.2/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "delete", "ip_prefix": "10.1.0.3/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "delete", "ip_prefix": "10.1.0.4/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}, \ + {"cmd": "delete", "ip_prefix": "10.1.0.5/32", "nexthop": "100.78.60.37", "vnid": 7039114, "mac_address": "00:0d:3a:f9:1a:20"}]' + logger.info("Deleting routes with vnid: 7039114 from VNET vnet-guid-10") + r = restapi.patch_config_vrouter_vrf_id_routes(construct_url, 'vnet-guid-10', params) + pytest_assert(r.status_code == 204) + + # Verify routes + params = '{}' + r = restapi.get_config_vrouter_vrf_id_routes(construct_url, 'vnet-guid-10', params) + pytest_assert(r.status_code == 200) + logger.info(r.json()) + pytest_assert(len(r.json()) == 0) + logger.info("Routes with vnid: 7039114 from VNET vnet-guid-10 have been deleted successfully") + +''' +This test creates a default VxLAN Tunnel and two VNETs. It adds VLAN, VLAN member, VLAN neighbor and routes to each VNET +''' +def test_create_interface(construct_url, vlan_members): + # Create VNET + params = '{"vnid": 4000}' + logger.info("Creating VNET vnet-guid-3 with vnid: 4000") + r = restapi.post_config_vrouter_vrf_id(construct_url, 'vnet-guid-4', params) + pytest_assert(r.status_code == 204) + + # Verify VNET has been created + r = restapi.get_config_vrouter_vrf_id(construct_url, 'vnet-guid-4') + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = '{"attr": {"vnid": 4000}, "vnet_id": "vnet-guid-4"}' + pytest_assert(r.json() == json.loads(expected)) + logger.info("VNET with vnet_id: vnet-guid-4 has been successfully created with vnid: 4000") + + # Create VLAN + params = '{"vnet_id": "vnet-guid-4", "ip_prefix": "40.0.0.1/24"}' + logger.info("Creating VLAN 4000 with ip_prefix: 40.0.0.1/24 under vnet_id: vnet-guid-4") + r = restapi.post_config_vlan(construct_url, '4000', params) + pytest_assert(r.status_code == 204) + + # Verify VLAN has been created + r = restapi.get_config_vlan(construct_url, '4000') + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = '{"attr": {"ip_prefix": "40.0.0.1/24", "vnet_id": "vnet-guid-4"}, "vlan_id": 4000}' + pytest_assert(r.json() == json.loads(expected)) + logger.info("VLAN 4000 with ip_prefix: 40.0.0.1/24 under vnet_id: vnet-guid-4 has been successfully created") + + vlan_intf = vlan_members[0] + logger.info("VLAN Interface: "+vlan_intf) + + # Add and configure VLAN member + params = '{"tagging_mode": "tagged"}' + logger.info("Adding "+vlan_intf+" with tagging_mode: tagged to VLAN 4000") + r = restapi.post_config_vlan_member(construct_url, '4000', vlan_intf, params) + pytest_assert(r.status_code == 204) + + # Verify VLAN member has been added + r = restapi.get_config_vlan_member(construct_url, '4000', vlan_intf) + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = '{"if_name": "'+vlan_intf+'", "vlan_id": 4000, "attr": {"tagging_mode": "tagged"}}' + pytest_assert(r.json() == json.loads(expected)) + logger.info(vlan_intf+" with tagging_mode: tagged has been successfully added to VLAN 4000") + + # Add neighbor + params = '{}' + logger.info("Adding neighbor 40.0.0.4 to VLAN 4000") + r = restapi.post_config_vlan_neighbor(construct_url, '4000', '40.0.0.4', params) + pytest_assert(r.status_code == 204) + + # Verify neighbor has been added + r = restapi.get_config_vlan_neighbor(construct_url, '4000', '40.0.0.4') + pytest_assert(r.status_code == 200) + logger.info(r.json()) + expected = '{"ip_addr": "40.0.0.4", "vlan_id": 4000}' + pytest_assert(r.json() == json.loads(expected)) + logger.info("Neighbor 40.0.0.4 has been successfully added to VLAN 4000") + + # Delete Neighbor + params = '{}' + logger.info("Deleting neighbor 40.0.0.4 from VLAN 4000") + r = restapi.delete_config_vlan_neighbor(construct_url, '4000', '40.0.0.4', params) + pytest_assert(r.status_code == 204) + + # Verify neighbor has been deleted + r = restapi.get_config_vlan_neighbor(construct_url, '4000', '40.0.0.4') + pytest_assert(r.status_code == 404) + logger.info(r.json()) + logger.info("Neighbor 40.0.0.4 has been successfully deleted to VLAN 4000") + + # Delete VLAN member + params = '{}' + logger.info("Deleting "+vlan_intf+" with tagging_mode: tagged to VLAN 4000") + r = restapi.delete_config_vlan_member(construct_url, '4000', vlan_intf, params) + pytest_assert(r.status_code == 204) + + # Verify VLAN member has been deleted + r = restapi.get_config_vlan_member(construct_url, '4000', vlan_intf) + pytest_assert(r.status_code == 404) + logger.info(r.json()) + logger.info(vlan_intf+" with tagging_mode: tagged has been successfully deleted to VLAN 4000") + + # Delete VLAN + params = '{}' + logger.info("Deleting VLAN 4000") + r = restapi.delete_config_vlan(construct_url, '4000', params) + pytest_assert(r.status_code == 204) + + # Verify VLAN has been deleted + r = restapi.get_config_vlan(construct_url, '4000') + pytest_assert(r.status_code == 404) + logger.info(r.json()) + logger.info("VLAN 4000 has been successfully deleted") + + # Delete VNET + params = '{}' + logger.info("Deleting VNET vnet-guid-3") + r = restapi.delete_config_vrouter_vrf_id(construct_url, 'vnet-guid-4', params) + pytest_assert(r.status_code == 204) + + # Verify VNET has been deleted + r = restapi.get_config_vrouter_vrf_id(construct_url, 'vnet-guid-4') + pytest_assert(r.status_code == 404) + logger.info(r.json()) + logger.info("VNET with vnet_id: vnet-guid-4 has been successfully deleted")