Skip to content

Commit 9ecaa3c

Browse files
Merge pull request #448 from globocom/develop
Develop
2 parents fcfb3ba + e444d6c commit 9ecaa3c

File tree

2 files changed

+122
-0
lines changed

2 files changed

+122
-0
lines changed

networkapi/api_interface/views.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from networkapi.util.decorators import prepare_search
4242
from networkapi.util.json_validate import json_validate
4343
from networkapi.util.json_validate import raise_json_validate
44+
from networkapi.util.interface_validate import InterfaceOverrideValidator
4445
from networkapi.util.geral import create_lock
4546
from networkapi.util.geral import destroy_lock
4647
from networkapi.util.geral import render_to_json
@@ -327,6 +328,10 @@ class InterfaceV3View(CustomAPIView):
327328
def get(self, request, *args, **kwargs):
328329
"""URL: api/v3/interface/"""
329330

331+
log.info('InterfaceV3View GET')
332+
log.info('kwargs: %s', kwargs)
333+
log.info('search: %s', self.search)
334+
330335
if not kwargs.get('obj_ids'):
331336
obj_model = facade.get_interface_by_search(self.search)
332337
interfaces = obj_model['query_set']
@@ -354,6 +359,8 @@ def get(self, request, *args, **kwargs):
354359
only_main_property=only_main_property
355360
)
356361

362+
log.info('get interfaces response: %s', data)
363+
357364
return Response(data, status=status.HTTP_200_OK)
358365

359366
@logs_method_apiview
@@ -369,8 +376,36 @@ def post(self, request, *args, **kwargs):
369376
response = list()
370377

371378
interfaces = request.DATA
379+
log.info('InterfaceV3View POST')
380+
log.info('interfaces: %s', interfaces)
381+
log.info('kwargs: %s', kwargs)
372382
json_validate(SPECS.get('interface_post')).validate(interfaces)
373383

384+
user_interface_str_list = []
385+
equipmemnt_interface_str_list = []
386+
for interface in interfaces.get('interfaces'):
387+
388+
# User interface input, ex.:
389+
# ex.: eth1, eth1/1, 1, Gi1/5, FF:FF:FF:FF:FF:F, int1, mgmt0, ethernet1/12, ..
390+
interface_input = interface['interface']
391+
user_interface_str_list.append(interface_input)
392+
393+
# Equipments from input interface
394+
equipment_id = interface['equipment']
395+
obj_model = facade.get_interface_by_search(
396+
{'extends_search': [], 'start_record': 0, 'custom_search': equipment_id, 'end_record': 1000, 'asorting_cols': ['id'], 'searchable_columns': ['equipamento__id']}
397+
)
398+
equipment_list = obj_model['query_set']
399+
log.debug("equipment_list %s", equipment_list)
400+
for equipment_interface in equipment_list:
401+
equipmemnt_interface_str_list.append(equipment_interface.interface)
402+
403+
# Validate interface overrinding
404+
InterfaceOverrideValidator().check_overriding(
405+
source_interface_str_list=user_interface_str_list,
406+
target_interface_str_list=equipmemnt_interface_str_list
407+
)
408+
374409
for i in interfaces.get('interfaces'):
375410
try:
376411
interface = facade.create_interface(i)

networkapi/util/interface_validate.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
"""
2+
Interface validator module
3+
"""
4+
import re
5+
import logging
6+
from networkapi.api_rest.exceptions import NetworkAPIException
7+
8+
log = logging.getLogger(__name__)
9+
10+
11+
class InterfaceOverrideValidator:
12+
"""
13+
Class responsible to interfaces (or ports) valitions.
14+
"""
15+
16+
def check_overriding(self, source_interface_str_list, target_interface_str_list):
17+
"""
18+
Public method to check if source interface overides target interfaces.
19+
20+
Allowed interfaces sample:
21+
source_interface_str_list = ['eth1/1', 'eth3/2']
22+
target_interface_str_list = ['eth2', 'eth3/1']
23+
24+
Prohibited interfaces sample:
25+
source_interface_str_list = ['eth1/1', 'eth3/2']
26+
target_interface_str_list = ['eth1', 'eth1/1', 'eth3']
27+
28+
:param source_interface_str_list str list: String array of interfaces, ex.: ['eth1', 'eth2', 'eth2/1']
29+
:param target_interface_str_list str list: String array of interfaces, ex.: ['eth2/1/3', 'eth2/1/2/1']
30+
:return first prohibited interface as False, otherwise, allowed interface as True:
31+
"""
32+
33+
try:
34+
35+
log.info('check_overriding START')
36+
log.info('source_interface_str_list: %s', source_interface_str_list)
37+
log.info('target_interface_str_list: %s', target_interface_str_list)
38+
39+
# Validate
40+
for source_interface_str in source_interface_str_list:
41+
for target_interface_str in target_interface_str_list:
42+
43+
log.info("Validating '%s' with '%s'", source_interface_str, source_interface_str)
44+
source_interface_array = [int(num) for num in re.findall(r'\d+', source_interface_str)]
45+
target_interface_array = [int(num) for num in re.findall(r'\d+', target_interface_str)]
46+
response = self._is_overriding(
47+
source_list=source_interface_array,
48+
target_list=target_interface_array)
49+
if not response:
50+
raise NetworkAPIException("A interface requisitada '{}' sobrepoe a interface '{}' do equipamento".format(
51+
source_interface_str, target_interface_str
52+
)
53+
)
54+
55+
except Exception as ex:
56+
raise NetworkAPIException(str(ex))
57+
58+
def _is_overriding(self, source_list, target_list, lvl=0):
59+
"""
60+
Private method check if source interface overides target interfaces.
61+
The interfaces are represented by array, ex. [1,1] is 'eth1/1'.
62+
63+
:param source interfaces: Represented array of interfaces, ex.: [1,1] [1,2,1] [2]
64+
:param source interfaces: Represented array of interfaces, ex.: [1] [1,2,3] [4]
65+
:param recursive level control.
66+
:return first prohibited interface as False, otherwise, allowed interface as True:
67+
"""
68+
69+
try:
70+
# Identical
71+
if source_list == target_list:
72+
log.info('*** PROHIBITED ***')
73+
return False
74+
elif not source_list or not target_list:
75+
log.info('**** PROHIBITED ****')
76+
return False
77+
elif source_list and target_list and source_list[0] == target_list[0]:
78+
return self._is_overriding(
79+
source_list=source_list[1:],
80+
target_list=target_list[1:],
81+
lvl=lvl+1
82+
)
83+
else:
84+
log.info('**** ALLOWED ****')
85+
return True
86+
except Exception as ex:
87+
raise NetworkAPIException(str(ex))

0 commit comments

Comments
 (0)