#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"
"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
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__
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()}
--- /dev/null
+#
+# -------------------------------------------------------------------------
+# 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()
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__)
'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.
"""
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)
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.
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)
--- /dev/null
+[
+ {
+ "nRTAC":234,
+ "taCellsList":[
+ {
+ "cellLocalId":15709
+ }
+ ]
+ },
+ {
+ "nRTAC":123,
+ "taCellsList":[
+ {
+ "cellLocalId":15709
+ }
+ ]
+ },
+ {
+ "nRTAC":421,
+ "taCellsList":[
+ {
+ "cellLocalId":15709
+ }
+ ]
+ }
+]
\ No newline at end of file
"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": {
"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"
+ }}}
}
}
},
"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
}
]
"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
"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
"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
"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
"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
"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,
}
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())
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
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',
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',
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: