Exemplo n.º 1
0
def create_measurement_group(subscription, measurement_group_name, body):
    """
    Creates a measurement group for a subscription

    Args:
        subscription (SubscriptionModel): Subscription.
        measurement_group_name (String): Name of MeasGroup
        body (dict): measurement group request body to save.

    """
    logger.info(
        f'Initiating create measurement group for: {measurement_group_name}')
    check_duplication(subscription.subscription_name, measurement_group_name)
    check_measurement_group_names_comply(measurement_group_name, body)
    new_mg = [
        save_measurement_group(body["measurementGroup"],
                               subscription.subscription_name)
    ]
    if body["measurementGroup"][
            "administrativeState"] == AdministrativeState.UNLOCKED.value:
        filtered_nfs = nf_service.capture_filtered_nfs(
            subscription.subscription_name)
        subscription_service.add_new_filtered_nfs(filtered_nfs, new_mg,
                                                  subscription)
    else:
        logger.info(
            f'Measurement Group {measurement_group_name} is not in an unlocked state'
        )
    db.session.commit()
 def test_publish_measurement_grp_to_nfs_failed(self, mock_filter_call,
                                                mock_logger, mock_publish,
                                                mock_model_aai, mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     mock_publish.side_effect = Exception('Publish failed')
     subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new2',
                                          'msrmt_grp_name-new2')
     subscription = json.loads(subscription)['subscription']
     sub_model = SubscriptionModel(subscription["subscriptionName"],
                                   subscription['operationalPolicyName'],
                                   subscription['controlLoopName'],
                                   'LOCKED')
     measurement_grp = MeasurementGroupModel('subscription_name_1',
                                             'msrmt_grp_name', 'UNLOCKED',
                                             15, 'pm.xml', [], [])
     measurement2 = self.create_measurement_grp(measurement_grp, 'meas2',
                                                'UNLOCKED')
     measurement3 = self.create_measurement_grp(measurement_grp, 'meas3',
                                                'LOCKED')
     measurement_grps = [measurement_grp, measurement2, measurement3]
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     filtered_nfs = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])
     subscription_service.publish_measurement_grp_to_nfs(
         sub_model, filtered_nfs, measurement_grps)
     mock_logger.assert_called_with(
         'Publish event failed for nf name, measure_grp_name, '
         'sub_name: pnf_33_ericsson,meas2, xtraPM-All-gNB-R2B-new2 '
         'with error: Publish failed')
Exemplo n.º 3
0
def create_subscription(subscription):
    """
    Creates a subscription

    Args:
        subscription (dict): subscription to save.

    Raises:
        DuplicateDataException: contains details on duplicate fields
        Exception: contains runtime error details
    """
    logger.info(f'Initiating create subscription for: {subscription["subscriptionName"]}')
    perform_validation(subscription)
    try:
        sub_model = save_subscription_request(subscription)
        db.session.commit()
        logger.info(f'Successfully saved subscription request for: '
                    f'{subscription["subscriptionName"]}')
        filtered_nfs = nf_service.capture_filtered_nfs(sub_model.subscription_name)
        unlocked_mgs = get_unlocked_measurement_grps(sub_model)
        add_new_filtered_nfs(filtered_nfs, unlocked_mgs, sub_model)
    except IntegrityError as e:
        db.session.rollback()
        raise DuplicateDataException(f'DB Integrity issue encountered: {e.orig.args[0]}') from e
    except Exception as e:
        db.session.rollback()
        raise e
    finally:
        db.session.remove()
 def test_publish_measurement_grp_to_nfs(self, mock_filter_call,
                                         mock_publish, mock_model_aai,
                                         mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     mock_publish.return_value = None
     subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new2',
                                          'msrmt_grp_name-new2')
     subscription = json.loads(subscription)['subscription']
     sub_model = SubscriptionModel(subscription["subscriptionName"],
                                   subscription['operationalPolicyName'],
                                   subscription['controlLoopName'],
                                   'LOCKED')
     measurement_grp = MeasurementGroupModel('subscription_name_1',
                                             'msrmt_grp_name', 'UNLOCKED',
                                             15, 'pm.xml', [], [])
     measurement2 = self.create_measurement_grp(measurement_grp, 'meas2',
                                                'UNLOCKED')
     measurement3 = self.create_measurement_grp(measurement_grp, 'meas3',
                                                'UNLOCKED')
     measurement_grps = [measurement_grp, measurement2, measurement3]
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     filtered_nfs = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])
     subscription_service.publish_measurement_grp_to_nfs(
         sub_model, filtered_nfs, measurement_grps)
     # Two unlocked measurement Group published
     self.assertEqual(mock_publish.call_count, 6)
Exemplo n.º 5
0
 def test_capture_filtered_nfs(self, mock_filter_call, mock_model_aai,
                               mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     subscription = json.loads(self.subscription_request)['subscription']
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     filtered_nfs = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])
     self.assertEqual(len(filtered_nfs), 2)
     self.assertEqual(filtered_nfs[0].nf_name, 'pnf201')
     self.assertEqual(filtered_nfs[1].nf_name, 'pnf_33_ericsson')
Exemplo n.º 6
0
 def test_save_nf_new_nf(self, mock_filter_call, mock_model_aai, mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     subscription = json.loads(self.subscription_request)['subscription']
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     nf = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])[0]
     nf.nf_name = 'newnf1'
     nf_service.save_nf(nf)
     network_function = NetworkFunctionModel.query.filter(
         NetworkFunctionModel.nf_name == nf.nf_name).one_or_none()
     self.assertIsNotNone(network_function)
    def test_apply_subscription_to_nfs(self, mock_filter_call, mock_model_aai,
                                       mock_aai):
        mock_aai.return_value = json.loads(self.aai_response_data)
        mock_model_aai.return_value = json.loads(self.good_model_info)
        subscription = json.loads(self.subscription_request)['subscription']
        mock_filter_call.return_value = NetworkFunctionFilter(
            **subscription["nfFilter"])
        filtered_nfs = nf_service.capture_filtered_nfs(
            subscription["subscriptionName"])
        subscription_service.apply_subscription_to_nfs(filtered_nfs,
                                                       'xtraPM-All-gNB-R2B')

        for nf in filtered_nfs:
            saved_nf_sub_rel = (NfSubRelationalModel.query.filter(
                NfSubRelationalModel.subscription_name == 'xtraPM-All-gNB-R2B',
                NfSubRelationalModel.nf_name == nf.nf_name).one_or_none())
            self.assertIsNotNone(saved_nf_sub_rel)
    def test_save_filtered_nfs(self, mock_filter_call, mock_model_aai,
                               mock_aai):
        mock_aai.return_value = json.loads(self.aai_response_data)
        mock_model_aai.return_value = json.loads(self.good_model_info)
        subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new',
                                             'msrmt_grp_name-new')
        subscription = json.loads(subscription)['subscription']
        mock_filter_call.return_value = NetworkFunctionFilter(
            **subscription["nfFilter"])
        filtered_nfs = nf_service.capture_filtered_nfs(
            subscription["subscriptionName"])
        subscription_service.save_filtered_nfs(filtered_nfs)

        for nf in filtered_nfs:
            saved_nf = (NetworkFunctionModel.query.filter(
                NetworkFunctionModel.nf_name == nf.nf_name).one_or_none())
            self.assertIsNotNone(saved_nf)
Exemplo n.º 9
0
def extract_del_new_nfs(sub_model):
    """
    Captures nfs to be deleted and created for the subscription

    Args:
        sub_model (SubscriptionModel): Subscription model to perform nfs delete

    Returns:
        del_nfs (List[String]): Names of nfs to be deleted
        new_nfs (List[NetworkFunction]): nfs to be inserted
    """
    filtered_nfs = nf_service.capture_filtered_nfs(sub_model.subscription_name)
    filtered_nf_names = [nf.nf_name for nf in filtered_nfs]
    existing_nf_names = [nf.nf_name for nf in sub_model.nfs]
    new_nfs = list(filter(lambda x: x.nf_name not in existing_nf_names, filtered_nfs))
    del_nfs = [nf.nf_name for nf in sub_model.nfs if nf.nf_name not in filtered_nf_names]
    return del_nfs, new_nfs
Exemplo n.º 10
0
def activate_nfs(sub_model, measurement_group):
    """
    Activates network functions associated with measurement group

    Args:
        sub_model (SubscriptionModel): Subscription model
        measurement_group (MeasurementGroupModel): Measurement group to update
    """
    new_nfs = []
    sub_nf_names = [nf.nf_name for nf in sub_model.nfs]
    filtered_nfs = nf_service.capture_filtered_nfs(sub_model.subscription_name)
    for nf in filtered_nfs:
        if nf.nf_name not in sub_nf_names:
            new_nfs.append(nf)
    if new_nfs:
        logger.info(f'Adding new nfs to the subscription: '
                    f'{sub_model.subscription_name}')
        subscription_service.save_filtered_nfs(new_nfs)
        subscription_service.apply_subscription_to_nfs(
            new_nfs, sub_model.subscription_name)
    for nf in filtered_nfs:
        logger.info(
            f'Saving measurement group to nf name, measure_grp_name: {nf.nf_name},'
            f'{measurement_group.measurement_group_name} with CREATE request')

        apply_nf_status_to_measurement_group(
            nf.nf_name, measurement_group.measurement_group_name,
            MgNfState.PENDING_CREATE.value)
        db.session.commit()
        try:
            network_function = NetworkFunction(**nf.serialize_nf())
            logger.info(
                f'Publishing event for nf name, measure_grp_name: {nf.nf_name},'
                f'{measurement_group.measurement_group_name}  with CREATE request'
            )
            publish_measurement_group(sub_model, measurement_group,
                                      network_function, 'CREATE')
        except Exception as ex:
            logger.error(
                f'Publish event failed for nf name, measure_grp_name, sub_name: '
                f'{nf.nf_name},{measurement_group.measurement_group_name}, '
                f'{sub_model.subscription_name} with error: {ex}')
 def test_apply_measurement_grp_to_nfs(self, mock_filter_call,
                                       mock_apply_nf, mock_model_aai,
                                       mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     mock_apply_nf.return_value = None
     subscription = self.create_test_subs('xtraPM-All-gNB-R2B-new2',
                                          'msrmt_grp_name-new2')
     subscription = json.loads(subscription)['subscription']
     measurement_grp = MeasurementGroupModel('subscription_name_1',
                                             'msrmt_grp_name', 'UNLOCKED',
                                             15, 'pm.xml', [], [])
     measurement2 = self.create_measurement_grp(measurement_grp, 'meas2',
                                                'UNLOCKED')
     unlocked_msgs = [measurement_grp, measurement2]
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     filtered_nfs = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])
     subscription_service.apply_measurement_grp_to_nfs(
         filtered_nfs, unlocked_msgs)
     # 2 measurement group with 2 nfs each contribute 4 calls
     self.assertEqual(mock_apply_nf.call_count, 4)
Exemplo n.º 12
0
 def test_create_nf_event_body(self, mock_filter_call, mock_model_aai,
                               mock_aai):
     mock_aai.return_value = json.loads(self.aai_response_data)
     mock_model_aai.return_value = json.loads(self.good_model_info)
     subscription = json.loads(self.subscription_request)['subscription']
     mock_filter_call.return_value = NetworkFunctionFilter(
         **subscription["nfFilter"])
     nf = nf_service.capture_filtered_nfs(
         subscription["subscriptionName"])[0]
     sub_model = SubscriptionModel(subscription["subscriptionName"],
                                   subscription['operationalPolicyName'],
                                   subscription['controlLoopName'],
                                   'LOCKED')
     event_body = nf_service.create_nf_event_body(nf, 'CREATE', sub_model)
     self.assertEqual(event_body['nfName'], nf.nf_name)
     self.assertEqual(event_body['ipAddress'], nf.ipv6_address)
     self.assertEqual(event_body['blueprintName'], nf.sdnc_model_name)
     self.assertEqual(event_body['blueprintVersion'], nf.sdnc_model_version)
     self.assertEqual(event_body['operationalPolicyName'],
                      sub_model.operational_policy_name)
     self.assertEqual(event_body['changeType'], 'CREATE')
     self.assertEqual(event_body['controlLoopName'],
                      sub_model.control_loop_name)