Skip to content
Snippets Groups Projects
Commit 08e7992a authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Context component:

- Corrected method UnsetSlice to remove endpoints, constraints, and config rules
parent 384f7e9c
No related branches found
No related tags found
2 merge requests!142Release TeraFlowSDN 2.1,!62Add relese/2.0.1 fixes
...@@ -80,7 +80,7 @@ def compose_config_rules_data( ...@@ -80,7 +80,7 @@ def compose_config_rules_data(
return dict_config_rules return dict_config_rules
def upsert_config_rules( def upsert_config_rules(
session : Session, config_rules : List[Dict], session : Session, config_rules : List[Dict], is_delete : bool = False,
device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None, device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None,
) -> bool: ) -> bool:
uuids_to_delete : Set[str] = set() uuids_to_delete : Set[str] = set()
...@@ -89,7 +89,9 @@ def upsert_config_rules( ...@@ -89,7 +89,9 @@ def upsert_config_rules(
for config_rule in config_rules: for config_rule in config_rules:
configrule_uuid = config_rule['configrule_uuid'] configrule_uuid = config_rule['configrule_uuid']
configrule_action = config_rule['action'] configrule_action = config_rule['action']
if configrule_action == ORM_ConfigActionEnum.SET: if is_delete or configrule_action == ORM_ConfigActionEnum.DELETE:
uuids_to_delete.add(configrule_uuid)
elif configrule_action == ORM_ConfigActionEnum.SET:
position = uuids_to_upsert.get(configrule_uuid) position = uuids_to_upsert.get(configrule_uuid)
if position is None: if position is None:
# if not added, add it # if not added, add it
...@@ -98,8 +100,6 @@ def upsert_config_rules( ...@@ -98,8 +100,6 @@ def upsert_config_rules(
else: else:
# if already added, update occurrence # if already added, update occurrence
rules_to_upsert[position] = config_rule rules_to_upsert[position] = config_rule
elif configrule_action == ORM_ConfigActionEnum.DELETE:
uuids_to_delete.add(configrule_uuid)
else: else:
MSG = 'Action for ConfigRule({:s}) is not supported '+\ MSG = 'Action for ConfigRule({:s}) is not supported '+\
'(device_uuid={:s}, service_uuid={:s}, slice_uuid={:s})' '(device_uuid={:s}, service_uuid={:s}, slice_uuid={:s})'
......
...@@ -81,29 +81,31 @@ def compose_constraints_data( ...@@ -81,29 +81,31 @@ def compose_constraints_data(
return dict_constraints return dict_constraints
def upsert_constraints( def upsert_constraints(
session : Session, constraints : List[Dict], session : Session, constraints : List[Dict], is_delete : bool = False,
service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None
) -> bool: ) -> bool:
uuids_to_upsert : Dict[str, int] = dict() uuids_to_upsert : Dict[str, int] = dict()
rules_to_upsert : List[Dict] = list() rules_to_upsert : List[Dict] = list()
for constraint in constraints: if not is_delete:
constraint_uuid = constraint['constraint_uuid'] for constraint in constraints:
position = uuids_to_upsert.get(constraint_uuid) constraint_uuid = constraint['constraint_uuid']
if position is None: position = uuids_to_upsert.get(constraint_uuid)
# if not added, add it if position is None:
rules_to_upsert.append(constraint) # if not added, add it
uuids_to_upsert[constraint_uuid] = len(rules_to_upsert) - 1 rules_to_upsert.append(constraint)
else: uuids_to_upsert[constraint_uuid] = len(rules_to_upsert) - 1
# if already added, update occurrence else:
rules_to_upsert[position] = constraint # if already added, update occurrence
rules_to_upsert[position] = constraint
# Delete all constraints not in uuids_to_upsert # Delete all constraints not in uuids_to_upsert
delete_affected = False delete_affected = False
if len(uuids_to_upsert) > 0: if is_delete or len(uuids_to_upsert) > 0:
stmt = delete(ConstraintModel) stmt = delete(ConstraintModel)
if service_uuid is not None: stmt = stmt.where(ConstraintModel.service_uuid == service_uuid) if service_uuid is not None: stmt = stmt.where(ConstraintModel.service_uuid == service_uuid)
if slice_uuid is not None: stmt = stmt.where(ConstraintModel.slice_uuid == slice_uuid ) if slice_uuid is not None: stmt = stmt.where(ConstraintModel.slice_uuid == slice_uuid )
stmt = stmt.where(ConstraintModel.constraint_uuid.not_in(set(uuids_to_upsert.keys()))) if not is_delete:
stmt = stmt.where(ConstraintModel.constraint_uuid.not_in(set(uuids_to_upsert.keys())))
#str_stmt = stmt.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True}) #str_stmt = stmt.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True})
#LOGGER.warning('delete stmt={:s}'.format(str(str_stmt))) #LOGGER.warning('delete stmt={:s}'.format(str(str_stmt)))
constraint_deletes = session.execute(stmt) constraint_deletes = session.execute(stmt)
...@@ -111,7 +113,7 @@ def upsert_constraints( ...@@ -111,7 +113,7 @@ def upsert_constraints(
delete_affected = int(constraint_deletes.rowcount) > 0 delete_affected = int(constraint_deletes.rowcount) > 0
upsert_affected = False upsert_affected = False
if len(constraints) > 0: if not is_delete and len(constraints) > 0:
stmt = insert(ConstraintModel).values(constraints) stmt = insert(ConstraintModel).values(constraints)
stmt = stmt.on_conflict_do_update( stmt = stmt.on_conflict_do_update(
index_elements=[ConstraintModel.constraint_uuid], index_elements=[ConstraintModel.constraint_uuid],
......
...@@ -178,10 +178,6 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]: ...@@ -178,10 +178,6 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
slice_name = raw_slice_uuid if len(raw_slice_name) == 0 else raw_slice_name slice_name = raw_slice_uuid if len(raw_slice_name) == 0 else raw_slice_name
context_uuid,slice_uuid = slice_get_uuid(request.slice_id, slice_name=slice_name, allow_random=False) context_uuid,slice_uuid = slice_get_uuid(request.slice_id, slice_name=slice_name, allow_random=False)
if len(request.slice_constraints) > 0: raise NotImplementedError('UnsetSlice: removal of constraints')
if len(request.slice_config.config_rules) > 0: raise NotImplementedError('UnsetSlice: removal of config rules')
#if len(request.slice_endpoint_ids) > 0: raise NotImplementedError('UnsetSlice: removal of endpoints')
slice_endpoint_uuids : Set[str] = set() slice_endpoint_uuids : Set[str] = set()
for i,endpoint_id in enumerate(request.slice_endpoint_ids): for i,endpoint_id in enumerate(request.slice_endpoint_ids):
endpoint_context_uuid = endpoint_id.topology_id.context_id.context_uuid.uuid endpoint_context_uuid = endpoint_id.topology_id.context_id.context_uuid.uuid
...@@ -203,6 +199,10 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]: ...@@ -203,6 +199,10 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
for subslice_id in request.slice_subslice_ids for subslice_id in request.slice_subslice_ids
} }
now = datetime.datetime.utcnow()
constraints = compose_constraints_data(request.slice_constraints, now, slice_uuid=slice_uuid)
config_rules = compose_config_rules_data(request.slice_config.config_rules, now, slice_uuid=slice_uuid)
def callback(session : Session) -> bool: def callback(session : Session) -> bool:
num_deletes = 0 num_deletes = 0
if len(slice_service_uuids) > 0: if len(slice_service_uuids) > 0:
...@@ -223,7 +223,11 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]: ...@@ -223,7 +223,11 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
SliceEndPointModel.slice_uuid == slice_uuid, SliceEndPointModel.slice_uuid == slice_uuid,
SliceEndPointModel.endpoint_uuid.in_(slice_endpoint_uuids) SliceEndPointModel.endpoint_uuid.in_(slice_endpoint_uuids)
)).delete() )).delete()
return num_deletes > 0
changed_constraints = upsert_constraints(session, constraints, is_delete=True, slice_uuid=slice_uuid)
changed_config_rules = upsert_config_rules(session, config_rules, is_delete=True, slice_uuid=slice_uuid)
return num_deletes > 0 or changed_constraints or changed_config_rules
updated = run_transaction(sessionmaker(bind=db_engine), callback) updated = run_transaction(sessionmaker(bind=db_engine), callback)
return json_slice_id(slice_uuid, json_context_id(context_uuid)),updated return json_slice_id(slice_uuid, json_context_id(context_uuid)),updated
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment