"Derive Coverage Area TA list from coverage area" 22/118022/3
authorhariharan97 <rh20085046@wipro.com>
Thu, 18 Feb 2021 08:07:33 +0000 (13:37 +0530)
committerhariharan97 <rh20085046@wipro.com>
Fri, 19 Feb 2021 12:55:11 +0000 (18:25 +0530)
Issue-ID: OPTFRA-910
Signed-off-by: hariharan97 <rh20085046@wipro.com>
Change-Id: I1f6e644987d093f9810bca75cf62834e08efd8b3

conductor.conf
conductor/conductor/data/plugins/inventory_provider/candidates/slice_profiles_candidate.py
conductor/conductor/data/plugins/inventory_provider/cps.py [new file with mode: 0644]
conductor/conductor/data/plugins/inventory_provider/generator.py
conductor/conductor/tests/unit/data/plugins/inventory_provider/coverage_area.json [new file with mode: 0644]
conductor/conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json
conductor/conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json
conductor/conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json
conductor/conductor/tests/unit/data/plugins/inventory_provider/test_candidates.py
conductor/conductor/tests/unit/data/plugins/inventory_provider/test_generator.py

index c6beec3..e3d710c 100755 (executable)
@@ -674,3 +674,51 @@ certificate_authority_bundle_file = /usr/local/bin/AAF_RootCA.cer
 #password =
 
 temp_path = "/tmp/nsttemplates"
+
+
+
+[cps]
+
+#
+# From conductor
+#
+
+
+# Data Store table prefix. (string value)
+#table_prefix = cps
+
+# Base URL for CPS, up to and not including the version, and without a
+# trailing slash. (string value)
+#yet to be finalized
+#server_url = https://cps.api.simpledemo.onap.org:8443/cps
+server_url=http://cps:8080/
+
+# Timeout for CPS Rest Call (string value)
+#cps_rest_timeout = 30
+
+# Number of retry for CPS Rest Call (string value)
+#cps_retries = 3
+
+
+# SSL/TLS certificate file in pem format. This certificate must be registered
+# with the CPS endpoint. (string value)
+#certificate_file = certificate.pem
+certificate_file =
+
+# Private Certificate Key file in pem format. (string value)
+#certificate_key_file = certificate_key.pem
+certificate_key_file =
+
+# Certificate Authority Bundle file in pem format. Must contain the appropriate
+# trust chain for the Certificate file. (string value)
+#certificate_authority_bundle_file = certificate_authority_bundle.pem
+certificate_authority_bundle_file = /usr/local/bin/AAF_RootCA.cer
+
+# Username for CPS. (string value)
+#username =
+
+# Password for CPS. (string value)
+#password =
+
+
+get_ta_list_url = "/api/v1/execute/ran-coverage-area/get_ta_list"
index db10ee5..83ca4d7 100644 (file)
@@ -41,7 +41,6 @@ ATTRIBUTE_AGGREGATION = {
     "exp_data_rate_ul": min,
     "exp_data_rate_dl": min,
     "ue_mobility_level": copy_first,
-    "coverage_area_ta_list": copy_first,
     "activity_factor": copy_first,
     "survival_time": copy_first,
     "max_number_of_conns": copy_first
@@ -58,6 +57,7 @@ class SliceProfilesCandidate(Candidate):
         else:
             self.slice_requirements = None
         self.other = kwargs["default_fields"]
+        self.coverage_area = kwargs["coverage_area"]
 
     def convert_nested_dict_to_dict(self):
         nested_dict = self.__dict__
@@ -86,9 +86,12 @@ def get_slice_requirements(subnet_requirements):
 
     slice_profile_tuples = {}
     for key in slice_requirements_keys:
-        attributes = []
-        for slice_profile in subnet_requirements.values():
-            attributes.append(slice_profile.get(key))
-        slice_profile_tuples[key] = attributes
+        if key == "coverage_area_ta_list":
+            pass
+        else:
+            attributes = []
+            for slice_profile in subnet_requirements.values():
+                attributes.append(slice_profile.get(key))
+            slice_profile_tuples[key] = attributes
 
     return {attr: ATTRIBUTE_AGGREGATION[attr](values) for attr, values in slice_profile_tuples.items()}
diff --git a/conductor/conductor/data/plugins/inventory_provider/cps.py b/conductor/conductor/data/plugins/inventory_provider/cps.py
new file mode 100644 (file)
index 0000000..c92d167
--- /dev/null
@@ -0,0 +1,145 @@
+#
+# -------------------------------------------------------------------------
+#   Copyright (C) 2021 Wipro Limited.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+# -------------------------------------------------------------------------
+#
+from conductor.common import rest
+from conductor.i18n import _LE
+from oslo_config import cfg
+from oslo_log import log
+import time
+import uuid
+
+
+LOG = log.getLogger(__name__)
+
+CONF = cfg.CONF
+
+CPS_OPTS = [
+    cfg.StrOpt('table_prefix',
+               default='cps',
+               help='Data Store table prefix.'),
+    cfg.StrOpt('server_url',
+               default='https://controller:8443/cps',
+               help='Base URL for CPS, up to and not including '
+                    'the version, and without a trailing slash.'),
+    cfg.StrOpt('cps_rest_timeout',
+               default='30',
+               help='Timeout for CPS Rest Call'),
+    cfg.StrOpt('cps_retries',
+               default='3',
+               help='Number of retry for CPS Rest Call'),
+    # TODO(larry): follow-up with ONAP people on this (CPS basic auth username and password?)
+    cfg.StrOpt('certificate_file',
+               default='certificate.pem',
+               help='SSL/TLS certificate file in pem format. '
+                    'This certificate must be registered with the CPS '
+                    'endpoint.'),
+    cfg.StrOpt('certificate_key_file',
+               default='certificate_key.pem',
+               help='Private Certificate Key file in pem format.'),
+    cfg.StrOpt('certificate_authority_bundle_file',
+               default='certificate_authority_bundle.pem',
+               help='Certificate Authority Bundle file in pem format. '
+                    'Must contain the appropriate trust chain for the '
+                    'Certificate file.'),
+    cfg.StrOpt('username',
+               default='',
+               help='Username for CPS.'),
+    cfg.StrOpt('password',
+               default='',
+               help='Password for CPS.'),
+    cfg.StrOpt('get_ta_list_url',
+               default='',
+               help="url to get ta_list")
+]
+
+CONF.register_opts(CPS_OPTS, group='cps')
+
+
+class CPS(object):
+
+    def __init__(self):
+        """Initializer"""
+
+        self.conf = CONF
+
+        self.base = self.conf.cps.server_url.rstrip('/')
+        self.cert = self.conf.cps.certificate_file
+        self.key = self.conf.cps.certificate_key_file
+        self.verify = self.conf.cps.certificate_authority_bundle_file
+        self.timeout = self.conf.cps.cps_rest_timeout
+        self.retries = self.conf.cps.cps_retries
+        self.username = self.conf.cps.username
+        self.password = self.conf.cps.password
+        self._init_python_request()
+
+    def _request(self, method='post', path='/', data=None,
+                 context=None, value=None):
+        """Performs HTTP request."""
+        headers = {
+            'X-FromAppId': 'CONDUCTOR',
+            'X-TransactionId': str(uuid.uuid4()),
+        }
+        kwargs = {
+            "method": method,
+            "path": path,
+            "headers": headers,
+            "data": data,
+        }
+
+        # TODO(jdandrea): Move timing/response logging into the rest helper?
+        start_time = time.time()
+        response = self.rest.request(**kwargs)
+        elapsed = time.time() - start_time
+        LOG.debug("Total time for CPS request "
+                  "({0:}: {1:}): {2:.3f} sec".format(context, value, elapsed))
+
+        if response is None:
+            LOG.error(_LE("No response from CPS ({}: {})").
+                      format(context, value))
+        elif response.status_code != 200:
+            LOG.error(_LE("CPS request ({}: {}) returned HTTP "
+                          "status {} {}, link: {}{}").
+                      format(context, value,
+                             response.status_code, response.reason,
+                             self.base, path))
+        return response
+
+    def _init_python_request(self):
+
+        kwargs = {
+            "server_url": self.base,
+            "retries": self.retries,
+            "username": self.username,
+            "password": self.password,
+            "read_timeout": self.timeout,
+        }
+        self.rest = rest.REST(**kwargs)
+
+    def get_coveragearea_ta(self, args):
+        response = self.get_cps_response(args)
+        return response
+
+    def get_cps_response(self, args):
+        path = self.conf.cps.get_ta_list_url
+        data = {}
+        data['input'] = {'zone_id': args}
+        cps_response = self._request('post', path, data=data)
+        if cps_response is None or cps_response.status_code != 200:
+            return None
+        if cps_response:
+            return cps_response.json()
index 17fe7a5..4664347 100644 (file)
@@ -29,6 +29,7 @@ from conductor.data.plugins.inventory_provider import base
 from conductor.data.plugins.inventory_provider.candidates.candidate import Candidate
 from conductor.data.plugins.inventory_provider.candidates.slice_profiles_candidate import get_slice_requirements
 from conductor.data.plugins.inventory_provider.candidates.slice_profiles_candidate import SliceProfilesCandidate
+from conductor.data.plugins.inventory_provider.cps import CPS
 
 LOG = log.getLogger(__name__)
 
@@ -87,7 +88,11 @@ class Generator(base.InventoryProviderBase):
                                             'reliability': {'values': [99.999]}},
                                    'ran': {'latency': {'min': 10, 'max': 20, 'steps': 1},
                                            'reliability': {'values': [99.99]},
-                                           'coverage_area_ta_list': {'values': ['City: Chennai']}}}
+                                           'coverage_area_ta_list': {"derive_from":{"method":"get_tracking_area",
+                                                                                "args": {
+                                                                         "coverage_area": {"get_param": "coverageArea"}
+                                                                                          }}}}}
+
             It will generate slice profile combination from the attributes for each subnet and
             generates combination of slice profile tuples from the each subnet.
         """
@@ -103,8 +108,9 @@ class Generator(base.InventoryProviderBase):
             if is_valid(get_slice_requirements(combination), filtering_attributes['service_profile']):
                 info = Candidate.build_candidate_info(self.name(), inventory_type, 1.0, candidate_uniqueness,
                                                       str(uuid.uuid4()))
+                coverage_area = filtering_attributes['service_profile'].get("coverage_area").get("value")
                 candidate = SliceProfilesCandidate(info=info, subnet_requirements=combination,
-                                                   default_fields=default_fields)
+                                                   default_fields=default_fields, coverage_area=coverage_area)
                 converted_candidate = candidate.convert_nested_dict_to_dict()
                 candidates.append(converted_candidate)
 
@@ -113,11 +119,26 @@ class Generator(base.InventoryProviderBase):
 
 def is_valid(converted_candidate, service_profile):
     for attr, attr_value in service_profile.items():
-        if not OPERATORS[attr_value['operator']](converted_candidate[attr], attr_value['value']):
-            return False
+        if attr == "coverage_area":
+            pass
+        else:
+            if not OPERATORS[attr_value['operator']](converted_candidate[attr], attr_value['value']):
+                return False
     return True
 
 
+def get_tracking_area(args):
+    coverage_list = []
+    coverage_area_zones_list = args.split("-")
+    zone_id_list = coverage_area_zones_list[1].split(",")
+    for zone_id in zone_id_list:
+        values = CPS().get_coveragearea_ta(zone_id)
+        for x in values:
+            if not x.get("nRTAC") in coverage_list:
+                coverage_list.append(x.get("nRTAC"))
+    return coverage_list
+
+
 def generate_combinations(attributes):
     """Generates all combination of the given attribute values.
 
@@ -125,13 +146,21 @@ def generate_combinations(attributes):
        from which the combinations are generated.
     """
     attr = dict()
+    ta_list = []
+
     for attribute, attr_params in attributes.items():
-        values = attr_params.get('values')
-        if not values:
+        if attr_params.get('values'):
+            values = attr_params.get('values')
+        elif attr_params.get('derive_from'):
+            derive_from = attr_params.get("derive_from")
+            method_name = derive_from.get("method")
+            args = derive_from.get("args").get("coverage_area")
+            ta_list = (eval(method_name)(args))
+            values = [ta_list]
+        else:
             values = range(attr_params.get('min', 1), attr_params.get('max'),
                            attr_params.get('steps', 1))
         attr[attribute] = values
-
     return get_combinations_from_dict(attr)
 
 
diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/coverage_area.json b/conductor/conductor/tests/unit/data/plugins/inventory_provider/coverage_area.json
new file mode 100644 (file)
index 0000000..0a250d8
--- /dev/null
@@ -0,0 +1,26 @@
+[
+   {
+      "nRTAC":234,
+      "taCellsList":[
+         {
+            "cellLocalId":15709
+         }
+      ]
+   },
+   {
+      "nRTAC":123,
+      "taCellsList":[
+         {
+            "cellLocalId":15709
+         }
+      ]
+   },
+   {
+      "nRTAC":421,
+      "taCellsList":[
+         {
+            "cellLocalId":15709
+         }
+      ]
+   }
+]
\ No newline at end of file
index a21b0ac..efd54ec 100644 (file)
@@ -18,7 +18,8 @@
             "filtering_attributes": {
                 "service_profile": {
                                         "latency": {"value": 20, "operator": "lte"},
-                                        "reliability": {"value": 99.99, "operator": "gte"}
+                                        "reliability": {"value": 99.99, "operator": "gte"},
+                                        "coverage_area": {"value": "City: Chennai-1,2,3", "operator": "eq"}
                                   },
                 "subnets": {
                     "core": {
@@ -46,7 +47,8 @@
             "filtering_attributes": {
                 "service_profile": {
                                         "latency": {"value": 20, "operator": "lte"},
-                                        "reliability": {"value": 99.99, "operator": "gte"}
+                                        "reliability": {"value": 99.99, "operator": "gte"},
+                                        "coverage_area": {"value": "City: Chennai-1,2,3", "operator": "eq"}
                                   },
                 "subnets": {
                     "core": {
                             "values": [
                                 99.99
                             ]
-                        }
+                        },
+                        "coverage_area_ta_list": {"derive_from":{"method":"get_tracking_area",
+                                                                                "args": {
+                                                                         "coverage_area": "City: Chennai-1,2,3"
+                                                                             }}}
                     }
                 }
             },
index 135b254..25faf46 100644 (file)
@@ -6,12 +6,12 @@
         "cost": 1.0,
         "latency": 25,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 26,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 11,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 27,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 12,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 28,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 13,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 29,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 14,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 15,
         "core_reliability": 99.99,
         "ran_latency": 15,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 26,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 16,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 27,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 16,
         "core_reliability": 99.99,
         "ran_latency": 11,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 28,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 16,
         "core_reliability": 99.99,
         "ran_latency": 12,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 29,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 16,
         "core_reliability": 99.99,
         "ran_latency": 13,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 16,
         "core_reliability": 99.99,
         "ran_latency": 14,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 27,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 17,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 28,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 17,
         "core_reliability": 99.99,
         "ran_latency": 11,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 29,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 17,
         "core_reliability": 99.99,
         "ran_latency": 12,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 17,
         "core_reliability": 99.99,
         "ran_latency": 13,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 28,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 18,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 29,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 18,
         "core_reliability": 99.99,
         "ran_latency": 11,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 18,
         "core_reliability": 99.99,
         "ran_latency": 12,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 29,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 19,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 19,
         "core_reliability": 99.99,
         "ran_latency": 11,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     },
     {
         "cost": 1.0,
         "latency": 30,
         "reliability": 99.99,
-        "coverage_area_ta_list": "City: Chennai",
+        "coverage_area": "City: Chennai-1,2,3",
         "core_latency": 20,
         "core_reliability": 99.99,
         "ran_latency": 10,
         "ran_reliability": 99.99,
-        "ran_coverage_area_ta_list": "City: Chennai",
+        "ran_coverage_area_ta_list": [234,123,421],
         "creation_cost": 0.9
     }
 ]
index ac9c674..72a305b 100644 (file)
@@ -8,6 +8,7 @@
             "cost": 1.0,
             "reliability": 99.99,
             "latency": 15,
+            "coverage_area": "City: Chennai-1,2,3",
             "core_latency": 15,
             "core_reliability": 99.99,
             "creation_cost": 0.9
@@ -19,6 +20,7 @@
             "cost": 1.0,
             "reliability": 99.99,
             "latency": 16,
+            "coverage_area": "City: Chennai-1,2,3",
             "core_latency": 16,
             "core_reliability": 99.99,
             "creation_cost": 0.9
@@ -30,6 +32,7 @@
             "cost": 1.0,
             "reliability": 99.99,
             "latency": 17,
+            "coverage_area": "City: Chennai-1,2,3",
             "core_latency": 17,
             "core_reliability": 99.99,
             "creation_cost": 0.9
@@ -41,6 +44,7 @@
             "cost": 1.0,
             "reliability": 99.99,
             "latency": 18,
+            "coverage_area": "City: Chennai-1,2,3",
             "core_latency": 18,
             "core_reliability": 99.99,
             "creation_cost": 0.9
@@ -52,6 +56,7 @@
             "cost": 1.0,
             "reliability": 99.99,
             "latency": 19,
+            "coverage_area": "City: Chennai-1,2,3",
             "core_latency": 19,
             "core_reliability": 99.99,
             "creation_cost": 0.9
index 8d9bcc5..ded58ad 100644 (file)
@@ -38,7 +38,7 @@ class TestCandidates(unittest.TestCase):
                                 "core_latency": 15,
                                 "core_reliability": 99.99,
                                 "cost": 1.0,
-                                "coverage_area_ta_list": "City: Chennai",
+                                "coverage_area": "City: Chennai",
                                 "inventory_provider": "generator",
                                 "inventory_type": "slice_profiles",
                                 "latency": 25,
@@ -55,6 +55,6 @@ class TestCandidates(unittest.TestCase):
                                }
 
         candidate = SliceProfilesCandidate(info=info, subnet_requirements=subnet_requirements,
-                                           default_fields={"creation_cost": 0.9})
+                                           default_fields={"creation_cost": 0.9},coverage_area="City: Chennai")
 
         self.assertEqual(expected_candidate, candidate.convert_nested_dict_to_dict())
index 2c0f207..6978940 100644 (file)
@@ -19,7 +19,9 @@
 
 import unittest
 import json
+import mock
 from mock import patch
+from conductor.data.plugins.inventory_provider.cps import CPS
 
 from conductor.data.plugins.inventory_provider.generator import Generator
 
@@ -36,23 +38,33 @@ class TestGenerator(unittest.TestCase):
 
         candidates_file = './conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json'
         expected_candidates = json.loads(open(candidates_file).read())
-
+        coverage_area_file='./conductor/tests/unit/data/plugins/inventory_provider/coverage_area.json'
+        coverage_area_json = json.loads(open(coverage_area_file).read())
         generator = Generator()
 
         filtering_attributes = {
                                   'service_profile': {
                                         'latency': {'value': 30, 'operator': 'lte'},
                                         'reliability': {'value': 99.99, 'operator': 'gte'},
-                                        'coverage_area_ta_list': {'value': 'City: Chennai', 'operator': 'eq'}
+                                        'coverage_area': {'value': 'City: Chennai-1,2,3', 'operator': 'eq'}
                                   },
                                   'subnets': {
                                      'core': {'latency': {'min': 15, 'max': 30, 'steps': 1},
                                               'reliability': {'values': [99.99]}},
                                      'ran': {'latency': {'min': 10, 'max': 30, 'steps': 1},
                                              'reliability': {'values': [99.99]},
-                                             'coverage_area_ta_list': {'values': ['City: Chennai']}}
+                                             'coverage_area_ta_list': {"derive_from":{"method":"get_tracking_area",
+                                                                                "args": {
+                                                                         "coverage_area": "Chennai-1,2,3"
+                                                                             }}}}
                                   }
                                 }
+        self.mock_get_coverage_area_ta = mock.patch.object(CPS, 'get_coveragearea_ta',
+                                                         return_value=coverage_area_json)
+
+        self.mock_get_coverage_area_ta.start()
+
+        self.maxDiff=None
 
         generated_candidates = generator.generate_candidates('slice_profiles', filtering_attributes,
                                                              candidate_uniqueness='true',
@@ -62,7 +74,7 @@ class TestGenerator(unittest.TestCase):
             self.assertIsNotNone(candidate['candidate_id'])
             del candidate['candidate_id']
 
-        self.assertCountEqual(expected_candidates, generated_candidates)
+        self.assertEqual(expected_candidates, generated_candidates)
 
         self.assertEqual([], generator.generate_candidates('cloud', filtering_attributes,
                                                            candidate_uniqueness='true',
@@ -71,11 +83,19 @@ class TestGenerator(unittest.TestCase):
     def test_resolve_demands(self):
         demands_file = './conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json'
         demands = json.loads(open(demands_file).read())
+        coverage_area_file = './conductor/tests/unit/data/plugins/inventory_provider/coverage_area.json'
+        coverage_area_json = json.loads(open(coverage_area_file).read())
 
         resolved_demands_file = './conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json'
         expected_resolved_demands = json.loads(open(resolved_demands_file).read())
 
         generator = Generator()
+        self.mock_get_coverage_area_ta = mock.patch.object(CPS, 'get_coveragearea_ta',
+                                                         return_value=coverage_area_json)
+
+        self.mock_get_coverage_area_ta.start()
+
+        self.maxDiff=None
         resolved_demands = generator.resolve_demands(demands, plan_info=None, triage_translator_data=None)
         for _, candidate_list in resolved_demands.items():
             for candidate in candidate_list: