Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 36 additions & 1 deletion tests/restapi/restapi_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
API_VERSION = 'v1'
GET = 'GET'
POST = 'POST'
DELETE = 'DELETE'
PATCH = 'PATCH'

class Restapi:
Expand All @@ -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()
Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand All @@ -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)
Expand All @@ -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)
Expand Down
180 changes: 180 additions & 0 deletions tests/restapi/test_restapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")