mirror of
				https://github.com/Telecominfraproject/oopt-gnpy.git
				synced 2025-10-30 17:47:50 +00:00 
			
		
		
		
	 79f198d6fe
			
		
	
	79f198d6fe
	
	
	
		
			
			- use the same file to test different configuration: with and without Eqpt sheet defined, add the abcdfgh topo for disjunction tests in the same file - change the name of files to avoid mixing with examples/meshTopologyExampleV2.xxx TODO: test if examples/ files pass for both path_requests_run and trasmission_main_example Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
		
			
				
	
	
		
			107 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| # TelecomInfraProject/gnpy/examples
 | |
| # Module name : test_disjunction.py
 | |
| # Version : 
 | |
| # License : BSD 3-Clause Licence
 | |
| # Copyright (c) 2018, Telecom Infra Project
 | |
| 
 | |
| """
 | |
| @author: esther.lerouzic
 | |
| checks that computed paths are disjoint as specified in the json service file
 | |
| """
 | |
| 
 | |
| from pathlib import Path
 | |
| import pytest
 | |
| from gnpy.core.equipment import load_equipment, trx_mode_params, automatic_nch
 | |
| from gnpy.core.network import load_network, build_network
 | |
| from examples.path_requests_run import (requests_from_json , correct_route_list ,
 | |
|                                         load_requests , disjunctions_from_json)
 | |
| from gnpy.core.request import compute_path_dsjctn, isdisjoint , find_reversed_path
 | |
| from gnpy.core.utils import db2lin, lin2db
 | |
| from gnpy.core.elements import Roadm
 | |
| 
 | |
| network_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
 | |
| service_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
 | |
| result_file_name  = Path(__file__).parent.parent / 'tests/data/testTopology_testresults.json'
 | |
| eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
 | |
| 
 | |
| @pytest.mark.parametrize("net",[network_file_name])
 | |
| @pytest.mark.parametrize("eqpt", [eqpt_library_name])
 | |
| @pytest.mark.parametrize("serv",[service_file_name])
 | |
| def test_disjunction(net,eqpt,serv):
 | |
|     data = load_requests(serv,eqpt)
 | |
|     equipment = load_equipment(eqpt)
 | |
|     network = load_network(net,equipment)
 | |
| 
 | |
|     # Build the network once using the default power defined in SI in eqpt config
 | |
|     # power density : db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
 | |
|     # spacing, f_min and f_max 
 | |
|     p_db = equipment['SI']['default'].power_dbm
 | |
|     
 | |
|     p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,\
 | |
|         equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | |
|     build_network(network, equipment, p_db, p_total_db)
 | |
| 
 | |
|     rqs = requests_from_json(data, equipment)
 | |
|     rqs = correct_route_list(network, rqs)
 | |
|     dsjn = disjunctions_from_json(data)
 | |
|     pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
 | |
|     print(dsjn)
 | |
| 
 | |
|     dsjn_list = [d.disjunctions_req for d in dsjn ]
 | |
| 
 | |
|     # assumes only pairs in dsjn list
 | |
|     test = True
 | |
|     for e in dsjn_list:
 | |
|         rqs_id_list = [r.request_id for r in rqs]
 | |
|         p1 = pths[rqs_id_list.index(e[0])][1:-1]
 | |
|         p2 = pths[rqs_id_list.index(e[1])][1:-1]
 | |
|         if isdisjoint(p1,p2) + isdisjoint(p1,find_reversed_path(p2, network)) > 0:
 | |
|             test = False
 | |
|             print(f'Computed path (roadms):{[e.uid for e in p1  if isinstance(e, Roadm)]}\n')
 | |
|             print(f'Computed path (roadms):{[e.uid for e in p2  if isinstance(e, Roadm)]}\n')
 | |
|             break
 | |
|     print(dsjn_list)
 | |
|     assert test
 | |
| 
 | |
| @pytest.mark.parametrize("net",[network_file_name])
 | |
| @pytest.mark.parametrize("eqpt", [eqpt_library_name])
 | |
| @pytest.mark.parametrize("serv",[service_file_name])
 | |
| def test_does_not_loop_back(net,eqpt,serv):
 | |
|     data = load_requests(serv,eqpt)
 | |
|     equipment = load_equipment(eqpt)
 | |
|     network = load_network(net,equipment)
 | |
| 
 | |
|     # Build the network once using the default power defined in SI in eqpt config
 | |
|     # power density : db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
 | |
|     # spacing, f_min and f_max 
 | |
|     p_db = equipment['SI']['default'].power_dbm
 | |
|     
 | |
|     p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,\
 | |
|         equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
 | |
|     build_network(network, equipment, p_db, p_total_db)
 | |
| 
 | |
|     rqs = requests_from_json(data, equipment)
 | |
|     rqs = correct_route_list(network, rqs)
 | |
|     dsjn = disjunctions_from_json(data)
 | |
|     pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
 | |
| 
 | |
|     # check that computed paths do not loop back ie each element appears only once
 | |
|     test = True
 | |
|     for p in pths :
 | |
|         for el in p:
 | |
|             p.remove(el)
 | |
|             a = [e for e in p if e.uid == el.uid]
 | |
|             if a :
 | |
|                 test = False
 | |
|                 break
 | |
| 
 | |
|     assert test        
 | |
| 
 | |
|     # TODO : test that identical requests are correctly agregated 
 | |
|     # and reproduce disjunction vector as well as route constraints
 | |
|     # check that requests with different parameters are not aggregated
 | |
| 
 | |
|     # check that the total agregated bandwidth is the same after aggregation
 | |
| 
 | |
|     #  |