Skip to content

Commit

Permalink
Do not allow configuring multi_policy_service_chain flag on a network
Browse files Browse the repository at this point in the history
if it has external route targets configured either in the 'import-and-export' table
or in both 'import' and 'export' tables.

Change-Id: I34355240bd17cc1c3d21296d00a4bc413671af13
Closes-Bug: 1547751
  • Loading branch information
cijohnson committed Feb 25, 2016
1 parent f97ea9f commit 166a894
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/config/api-server/vnc_cfg_types.py
Expand Up @@ -7,6 +7,7 @@
# to type of resource. For eg. allocation of mac/ip-addr for a port during its
# creation.

import copy
from cfgm_common import jsonutils as json
import re
import itertools
Expand Down Expand Up @@ -681,9 +682,41 @@ def _check_provider_details(cls, obj_dict, db_conn, create):

return (True, '')

@classmethod
def _is_multi_policy_service_chain_supported(cls, obj_dict, read_result=None):
if not ('multi_policy_service_chains_enabled' in obj_dict or
'route_target_list' in obj_dict or
'import_route_target_list' in obj_dict or
'export_route_target_list' in obj_dict):
return (True, '')

# Create Request
if not read_result:
read_result = {}

result_obj_dict = copy.deepcopy(read_result)
result_obj_dict.update(obj_dict)
if result_obj_dict.get('multi_policy_service_chains_enabled'):
import_export_targets = result_obj_dict.get('route_target_list', {})
import_targets = result_obj_dict.get('import_route_target_list', {})
export_targets = result_obj_dict.get('export_route_target_list', {})
import_targets_set = set(import_targets.get('route_target', []))
export_targets_set = set(export_targets.get('route_target', []))
targets_in_both_import_and_export = \
import_targets_set.intersection(export_targets_set)
if (import_export_targets.get('route_target', []) or
targets_in_both_import_and_export):
msg = "Multi policy service chains are not supported, "
msg += "with both import export external route targets"
return (False, (409, msg))

return (True, '')

@classmethod
def pre_dbe_create(cls, tenant_name, obj_dict, db_conn):
(ok, response) = cls._is_multi_policy_service_chain_supported(obj_dict)
if not ok:
return (ok, response)
user_visibility = obj_dict['id_perms'].get('user_visible', True)
verify_quota_kwargs = {'db_conn': db_conn,
'fq_name': obj_dict['fq_name'],
Expand Down Expand Up @@ -770,6 +803,10 @@ def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs):
if not read_ok:
return (False, (500, read_result))

(ok, response) = cls._is_multi_policy_service_chain_supported(obj_dict,
read_result)
if not ok:
return (ok, response)

(ok, result) = cls.addr_mgmt.net_check_subnet(obj_dict)
if not ok:
Expand Down

0 comments on commit 166a894

Please sign in to comment.