From 3268cb7560c35cdc1bd2617f1dfcd915695fe352 Mon Sep 17 00:00:00 2001
From: Lluis Gifre <lluis.gifre@cttc.es>
Date: Wed, 3 Nov 2021 11:40:01 +0100
Subject: [PATCH] Changes in Config Model:

- Added method to delete config rules when action is DELETE.
- Temporary changes in run_tests_local.sh scripts
---
 run_tests_locally.sh                          | 26 ++++++++++-------
 src/context/service/database/ConfigModel.py   | 28 ++++++++++++++----
 .../data_cache/database/ConfigModel.py        | 29 +++++++++++++++----
 3 files changed, 62 insertions(+), 21 deletions(-)

diff --git a/run_tests_locally.sh b/run_tests_locally.sh
index 5c932487d..a6c6b6c43 100755
--- a/run_tests_locally.sh
+++ b/run_tests_locally.sh
@@ -11,26 +11,30 @@ cat $PROJECTDIR/coverage/.coveragerc.template | sed s+~/teraflow/controller+$PRO
 
 # Run unitary tests and analyze coverage of code at same time
 
+# Populate environment variables for context to use Redis
+export REDIS_SERVICE_HOST=$(kubectl get node kubernetes-master -o 'jsonpath={.status.addresses[?(@.type=="InternalIP")].address}')
+export REDIS_SERVICE_PORT=$(kubectl get service contextservice-public --namespace cttc-dev -o 'jsonpath={.spec.ports[?(@.port==6379)].nodePort}')
+
 # First destroy old coverage file
 rm -f $COVERAGEFILE
 
-#coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
-#    common/orm/tests/test_unitary.py \
-#    common/message_broker/tests/test_unitary.py \
-#    common/rpc_method_wrapper/tests/test_unitary.py
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    common/orm/tests/test_unitary.py \
+    common/message_broker/tests/test_unitary.py \
+    common/rpc_method_wrapper/tests/test_unitary.py
 
-#coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
-#    centralizedattackdetector/tests/test_unitary.py
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    centralizedattackdetector/tests/test_unitary.py
 
-#coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
-#    context/tests/test_unitary.py
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    context/tests/test_unitary.py
 
 coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    device/tests/test_unitary_driverapi.py \
     device/tests/test_unitary.py
-    #device/tests/test_unitary_driverapi.py \
 
 #coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
 #    service/tests/test_unitary.py
 
-#coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
-#    compute/tests/test_unitary.py
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    compute/tests/test_unitary.py
diff --git a/src/context/service/database/ConfigModel.py b/src/context/service/database/ConfigModel.py
index 8754da786..774ea3743 100644
--- a/src/context/service/database/ConfigModel.py
+++ b/src/context/service/database/ConfigModel.py
@@ -1,8 +1,8 @@
 import functools, logging, operator
 from enum import Enum
-from typing import Dict, List, Tuple, Union
+from typing import Dict, List, Optional, Tuple, Union
 from common.orm.Database import Database
-from common.orm.HighLevel import get_or_create_object, update_or_create_object
+from common.orm.HighLevel import get_object, get_or_create_object, update_or_create_object
 from common.orm.backend.Tools import key_to_str
 from common.orm.fields.EnumeratedField import EnumeratedField
 from common.orm.fields.ForeignKeyField import ForeignKeyField
@@ -66,6 +66,17 @@ def set_config_rule(
     db_config_rule, updated = result
     return db_config_rule, updated
 
+def delete_config_rule(
+    database : Database, db_config : ConfigModel, grpc_config_rule
+    ) -> Tuple[ConfigRuleModel, bool]:
+
+    str_rule_key_hash = fast_hasher(grpc_config_rule.resource_key)
+    str_config_rule_key = key_to_str([db_config.pk, str_rule_key_hash], separator=':')
+
+    db_config_rule : Optional[ConfigRuleModel] = get_object(
+        database, ConfigRuleModel, str_config_rule_key, raise_if_not_found=False)
+    db_config_rule.delete()
+
 def set_config(
     database : Database, db_parent_pk : str, config_name : str, grpc_config_rules
     ) -> List[Tuple[Union[ConfigModel, ConfigRuleModel], bool]]:
@@ -77,8 +88,15 @@ def set_config(
     db_objects = [(db_config, created)]
 
     for position,grpc_config_rule in enumerate(grpc_config_rules):
-        result : Tuple[ConfigRuleModel, bool] = set_config_rule(database, db_config, grpc_config_rule, position)
-        db_config_rule, updated = result
-        db_objects.append((db_config_rule, updated))
+        action = grpc_to_enum__config_action(grpc_config_rule.action)
+        if action == ORM_ConfigActionEnum.SET:
+            result : Tuple[ConfigRuleModel, bool] = set_config_rule(database, db_config, grpc_config_rule, position)
+            db_config_rule, updated = result
+            db_objects.append((db_config_rule, updated))
+        elif action == ORM_ConfigActionEnum.DELETE:
+            delete_config_rule(database, db_config, grpc_config_rule)
+        else:
+            msg = 'Unsupported action({:s})'
+            raise AttributeError(msg.format(str(ConfigActionEnum.Name(grpc_config_rule.action))))
 
     return db_objects
diff --git a/src/device/service/data_cache/database/ConfigModel.py b/src/device/service/data_cache/database/ConfigModel.py
index 73fc06eb5..ce5904bc2 100644
--- a/src/device/service/data_cache/database/ConfigModel.py
+++ b/src/device/service/data_cache/database/ConfigModel.py
@@ -1,8 +1,8 @@
 import functools, logging, operator
 from enum import Enum
-from typing import Dict, List, Tuple, Union
+from typing import Dict, List, Optional, Tuple, Union
 from common.orm.Database import Database
-from common.orm.HighLevel import get_or_create_object, update_or_create_object
+from common.orm.HighLevel import get_object, get_or_create_object, update_or_create_object
 from common.orm.backend.Tools import key_to_str
 from common.orm.fields.EnumeratedField import EnumeratedField
 from common.orm.fields.ForeignKeyField import ForeignKeyField
@@ -66,6 +66,18 @@ def set_config_rule(
     db_config_rule, updated = result
     return db_config_rule, updated
 
+def delete_config_rule(
+    database : Database, db_config : ConfigModel, grpc_config_rule
+    ) -> Tuple[ConfigRuleModel, bool]:
+
+    str_rule_key_hash = fast_hasher(grpc_config_rule.resource_key)
+    str_config_rule_key = key_to_str([db_config.pk, str_rule_key_hash], separator=':')
+
+    db_config_rule : Optional[ConfigRuleModel] = get_object(
+        database, ConfigRuleModel, str_config_rule_key, raise_if_not_found=False)
+    if db_config_rule is None: return
+    db_config_rule.delete()
+
 def set_config(
     database : Database, db_parent_pk : str, config_name : str, grpc_config_rules
     ) -> List[Tuple[Union[ConfigModel, ConfigRuleModel], bool]]:
@@ -77,8 +89,15 @@ def set_config(
     db_objects = [(db_config, created)]
 
     for position,grpc_config_rule in enumerate(grpc_config_rules):
-        result : Tuple[ConfigRuleModel, bool] = set_config_rule(database, db_config, grpc_config_rule, position)
-        db_config_rule, updated = result
-        db_objects.append((db_config_rule, updated))
+        action = grpc_to_enum__config_action(grpc_config_rule.action)
+        if action == ORM_ConfigActionEnum.SET:
+            result : Tuple[ConfigRuleModel, bool] = set_config_rule(database, db_config, grpc_config_rule, position)
+            db_config_rule, updated = result
+            db_objects.append((db_config_rule, updated))
+        elif action == ORM_ConfigActionEnum.DELETE:
+            delete_config_rule(database, db_config, grpc_config_rule)
+        else:
+            msg = 'Unsupported action({:s})'
+            raise AttributeError(msg.format(str(ConfigActionEnum.Name(grpc_config_rule.action))))
 
     return db_objects
-- 
GitLab