summaryrefslogtreecommitdiffstats
path: root/components/pm-subscription-handler/pmsh_service/mod/subscription.py
diff options
context:
space:
mode:
authorERIMROB <robertas.rimkus@est.tech>2020-02-12 11:35:20 +0000
committerERIMROB <robertas.rimkus@est.tech>2020-02-20 16:03:48 +0000
commit26b76c02052269ea850d8d4efd6deb536115a0af (patch)
treef7485d7ccd0e7d95c000b9c05bce2c371c34581a /components/pm-subscription-handler/pmsh_service/mod/subscription.py
parentd42ac06c733c43e19a01b4203c1b987b4973ccfd (diff)
Add Support for Activation and Deactivation
* Add support for reconfiguration of the administrativeState field * Add support for policy feedback handling * Fix network function filter applying to non active network functions Signed-off-by: ERIMROB <robertas.rimkus@est.tech> Change-Id: Ic1cfc3207b2495c1d8d10acd0ed1c40114cf4643 Issue-ID: DCAEGEN2-1830
Diffstat (limited to 'components/pm-subscription-handler/pmsh_service/mod/subscription.py')
-rwxr-xr-xcomponents/pm-subscription-handler/pmsh_service/mod/subscription.py77
1 files changed, 75 insertions, 2 deletions
diff --git a/components/pm-subscription-handler/pmsh_service/mod/subscription.py b/components/pm-subscription-handler/pmsh_service/mod/subscription.py
index 265d90b8..031609aa 100755
--- a/components/pm-subscription-handler/pmsh_service/mod/subscription.py
+++ b/components/pm-subscription-handler/pmsh_service/mod/subscription.py
@@ -16,10 +16,25 @@
# SPDX-License-Identifier: Apache-2.0
# ============LICENSE_END=====================================================
import re
+from enum import Enum
import mod.pmsh_logging as logger
from mod import db
from mod.db_models import SubscriptionModel, NfSubRelationalModel
+from tenacity import retry, retry_if_exception_type, wait_exponential, stop_after_attempt
+
+
+class SubNfState(Enum):
+ PENDING_CREATE = 'PENDING_CREATE'
+ CREATE_FAILED = 'CREATE_FAILED'
+ CREATED = 'CREATED'
+ PENDING_DELETE = 'PENDING_DELETE'
+ DELETE_FAILED = 'DELETE_FAILED'
+
+
+class AdministrativeState(Enum):
+ UNLOCKED = 'UNLOCKED'
+ LOCKED = 'LOCKED'
class Subscription:
@@ -42,7 +57,10 @@ class Subscription:
dict: the Subscription event to be published.
"""
clean_sub = {k: v for k, v in self.__dict__.items() if k != 'nfFilter'}
- clean_sub.update({'nfName': xnf_name, 'policyName': f'OP-{self.subscriptionName}'})
+ clean_sub.update({'nfName': xnf_name, 'policyName': f'OP-{self.subscriptionName}',
+ 'changeType': 'DELETE'
+ if self.administrativeState == AdministrativeState.LOCKED.value
+ else 'CREATE'})
return clean_sub
def create(self):
@@ -84,7 +102,8 @@ class Subscription:
NfSubRelationalModel.subscription_name == current_sub.subscription_name,
NfSubRelationalModel.nf_name == current_nf.nf_name).one_or_none()
if existing_entry is None:
- new_nf_sub = NfSubRelationalModel(current_sub.subscription_name, nf.nf_name)
+ new_nf_sub = NfSubRelationalModel(current_sub.subscription_name,
+ nf.nf_name, SubNfState.PENDING_CREATE.value)
new_nf_sub.nf = current_nf
logger.debug(current_nf)
current_sub.nfs.append(new_nf_sub)
@@ -114,6 +133,44 @@ class Subscription:
"""
return SubscriptionModel.query.all()
+ def update_subscription_status(self):
+ """ Updates the status of subscription in subscription table """
+ SubscriptionModel.query.filter(
+ SubscriptionModel.subscription_name == self.subscriptionName). \
+ update({SubscriptionModel.status: self.administrativeState},
+ synchronize_session='evaluate')
+
+ db.session.commit()
+
+ def delete_subscription(self):
+ """ Deletes a subscription from the database """
+ SubscriptionModel.query.filter(
+ SubscriptionModel.subscription_name == self.subscriptionName). \
+ delete(synchronize_session='evaluate')
+
+ db.session.commit()
+
+ @retry(wait=wait_exponential(multiplier=1, min=30, max=120), stop=stop_after_attempt(3),
+ retry=retry_if_exception_type(Exception))
+ def process_subscription(self, nfs, mr_pub):
+ action = 'Deactivate'
+ sub_nf_state = SubNfState.PENDING_DELETE.value
+ self.update_subscription_status()
+
+ if self.administrativeState == AdministrativeState.UNLOCKED.value:
+ action = 'Activate'
+ sub_nf_state = SubNfState.PENDING_CREATE.value
+
+ try:
+ for nf in nfs:
+ mr_pub.publish_subscription_event_data(self, nf.nf_name)
+ logger.debug(f'Publishing Event to {action} '
+ f'Sub: {self.subscriptionName} for the nf: {nf.nf_name}')
+ self.add_network_functions_to_subscription(nfs)
+ self.update_sub_nf_status(self.subscriptionName, sub_nf_state, nf.nf_name)
+ except Exception as err:
+ raise Exception(f'Error publishing activation event to MR: {err}')
+
@staticmethod
def get_all_nfs_subscription_relations():
""" Retrieves all network function to subscription relations
@@ -125,6 +182,22 @@ class Subscription:
return nf_per_subscriptions
+ @staticmethod
+ def update_sub_nf_status(subscription_name, status, nf_name):
+ """ Updates the status of the subscription for a particular nf
+
+ Args:
+ subscription_name (str): The subscription name
+ nf_name (str): The network function name
+ status (str): Status of the subscription
+ """
+ NfSubRelationalModel.query.filter(
+ NfSubRelationalModel.subscription_name == subscription_name,
+ NfSubRelationalModel.nf_name == nf_name). \
+ update({NfSubRelationalModel.nf_sub_status: status}, synchronize_session='evaluate')
+
+ db.session.commit()
+
class NetworkFunctionFilter:
def __init__(self, **kwargs):