From ad5d64f9df4eea5379db1aad2f75369c345eb4b1 Mon Sep 17 00:00:00 2001 From: krishnaa96 Date: Mon, 28 Sep 2020 13:11:41 +0530 Subject: Fix to support multiple inventory providers Add generator plugin to extensions Aggregate candidate from multiple inv providers Limit no of candidates generated by generator Issue-ID: OPTFRA-854 Signed-off-by: krishnaa96 Change-Id: I536a62e8616b1b4d9261d9d08540a8db5104af23 --- .../inventory_provider/candidates/__init__.py | 0 .../candidates/slice_profiles_candidate.py | 37 +- .../data/plugins/inventory_provider/generator.py | 44 +- .../plugins/inventory_provider/utils/__init__.py | 0 conductor/conductor/data/service.py | 13 +- .../inventory_provider/gen_demand_list.json | 84 ++- .../inventory_provider/generated_candidates.json | 697 ++++----------------- .../inventory_provider/resolved_demands_gen.json | 151 +---- .../plugins/inventory_provider/test_candidates.py | 6 +- .../plugins/inventory_provider/test_generator.py | 30 +- conductor/setup.cfg | 1 + 11 files changed, 296 insertions(+), 767 deletions(-) create mode 100644 conductor/conductor/data/plugins/inventory_provider/candidates/__init__.py create mode 100644 conductor/conductor/data/plugins/inventory_provider/utils/__init__.py (limited to 'conductor') diff --git a/conductor/conductor/data/plugins/inventory_provider/candidates/__init__.py b/conductor/conductor/data/plugins/inventory_provider/candidates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/conductor/conductor/data/plugins/inventory_provider/candidates/slice_profiles_candidate.py b/conductor/conductor/data/plugins/inventory_provider/candidates/slice_profiles_candidate.py index 3e57d64..db10ee5 100644 --- a/conductor/conductor/data/plugins/inventory_provider/candidates/slice_profiles_candidate.py +++ b/conductor/conductor/data/plugins/inventory_provider/candidates/slice_profiles_candidate.py @@ -53,31 +53,42 @@ class SliceProfilesCandidate(Candidate): def __init__(self, **kwargs): super().__init__(kwargs["info"]) self.subnet_requirements = kwargs["subnet_requirements"] + if "slice_requirements" in kwargs: + self.slice_requirements = kwargs["slice_requirements"] + else: + self.slice_requirements = None + self.other = kwargs["default_fields"] def convert_nested_dict_to_dict(self): nested_dict = self.__dict__ - slice_requirements = self.get_slice_requirements() + if not self.slice_requirements: + self.slice_requirements = get_slice_requirements(self.subnet_requirements) slice_profile_candidate = copy.deepcopy(nested_dict) + slice_profile_candidate.pop("slice_requirements") slice_profile_candidate.pop("subnet_requirements") - slice_profile_candidate.update(slice_requirements) + slice_profile_candidate.pop("other") + slice_profile_candidate.update(self.slice_requirements) for subnet, slice_profile in self.subnet_requirements.items(): subnet_req = {f'{subnet}_{key}': value for key, value in slice_profile.items()} slice_profile_candidate.update(subnet_req) + slice_profile_candidate.update(self.other) + return slice_profile_candidate - def get_slice_requirements(self): - slice_requirements_keys = set() - for slice_profile in self.subnet_requirements.values(): - slice_requirements_keys.update(slice_profile.keys()) - slice_profile_tuples = {} - for key in slice_requirements_keys: - attributes = [] - for slice_profile in self.subnet_requirements.values(): - attributes.append(slice_profile.get(key)) - slice_profile_tuples[key] = attributes +def get_slice_requirements(subnet_requirements): + slice_requirements_keys = set() + for slice_profile in subnet_requirements.values(): + slice_requirements_keys.update(slice_profile.keys()) + + 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 - return {attr: ATTRIBUTE_AGGREGATION[attr](values) for attr, values in slice_profile_tuples.items()} + return {attr: ATTRIBUTE_AGGREGATION[attr](values) for attr, values in slice_profile_tuples.items()} diff --git a/conductor/conductor/data/plugins/inventory_provider/generator.py b/conductor/conductor/data/plugins/inventory_provider/generator.py index 693b7c7..17fe7a5 100644 --- a/conductor/conductor/data/plugins/inventory_provider/generator.py +++ b/conductor/conductor/data/plugins/inventory_provider/generator.py @@ -18,23 +18,35 @@ # import itertools +from operator import eq +from operator import ge +from operator import le import uuid from oslo_log import log 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 LOG = log.getLogger(__name__) +OPERATORS = {'gte': ge, + 'lte': le, + 'eq': eq} + + class Generator(base.InventoryProviderBase): def __init__(self): """Initialize variables""" pass + def initialize(self): + pass + def name(self): """Return human-readable name.""" return "generator" @@ -48,22 +60,26 @@ class Generator(base.InventoryProviderBase): inventory_type = requirement.get('inventory_type').lower() candidate_uniqueness = requirement.get('unique', 'true') filtering_attributes = requirement.get('filtering_attributes') + default_fields = requirement.get('default_attributes') resolved_demands[name].extend(self.generate_candidates(inventory_type, filtering_attributes, - candidate_uniqueness)) + candidate_uniqueness, + default_fields)) return resolved_demands - def generate_candidates(self, inventory_type, filtering_attributes, candidate_uniqueness): + def generate_candidates(self, inventory_type, filtering_attributes, candidate_uniqueness, default_fields): if inventory_type == "slice_profiles": - return self.generate_slice_profile_candidates(filtering_attributes, inventory_type, candidate_uniqueness) + return self.generate_slice_profile_candidates(filtering_attributes, inventory_type, + candidate_uniqueness, default_fields) else: LOG.debug("No functionality implemented for \ generating candidates for inventory_type {}".format(inventory_type)) return [] - def generate_slice_profile_candidates(self, filtering_attributes, inventory_type, candidate_uniqueness): + def generate_slice_profile_candidates(self, filtering_attributes, inventory_type, + candidate_uniqueness, default_fields): """Generates a list of slice profile candidate based on the filtering attributes, A sample filtering attribute is given below @@ -76,7 +92,7 @@ class Generator(base.InventoryProviderBase): generates combination of slice profile tuples from the each subnet. """ subnet_combinations = {} - for subnet, attributes in filtering_attributes.items(): + for subnet, attributes in filtering_attributes['subnets'].items(): attribute_names, attribute_combinations = generate_combinations(attributes) subnet_combinations[subnet] = organize_combinations(attribute_names, attribute_combinations) @@ -84,14 +100,24 @@ class Generator(base.InventoryProviderBase): organized_combinations = organize_combinations(subnet_names, slice_profile_combinations) candidates = [] for combination in organized_combinations: - info = Candidate.build_candidate_info(self.name(), inventory_type, 1.0, candidate_uniqueness, - str(uuid.uuid4())) - candidate = SliceProfilesCandidate(info=info, subnet_requirements=combination) - candidates.append(candidate.convert_nested_dict_to_dict()) + 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())) + candidate = SliceProfilesCandidate(info=info, subnet_requirements=combination, + default_fields=default_fields) + converted_candidate = candidate.convert_nested_dict_to_dict() + candidates.append(converted_candidate) return candidates +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 + return True + + def generate_combinations(attributes): """Generates all combination of the given attribute values. diff --git a/conductor/conductor/data/plugins/inventory_provider/utils/__init__.py b/conductor/conductor/data/plugins/inventory_provider/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/conductor/conductor/data/service.py b/conductor/conductor/data/service.py index 67d3c8c..48f3305 100644 --- a/conductor/conductor/data/service.py +++ b/conductor/conductor/data/service.py @@ -632,7 +632,10 @@ class DataEndpoint(object): demands, plan_info, triage_translator_data ) if results and len(results) > 0: - resolved_demands = results[0] + if len(results) > 1: + resolved_demands = self.get_resolved_demands_from_result(results) + else: + resolved_demands = results[0] if self.triage_data_trans['plan_id']== None : self.triage_data_trans['plan_name'] = triage_translator_data['plan_name'] self.triage_data_trans['plan_id'] = triage_translator_data['plan_id'] @@ -655,6 +658,14 @@ class DataEndpoint(object): 'trans': self.triage_data_trans}, 'error': error} + def get_resolved_demands_from_result(self, results): + resolved_demands = {de: [] for de in results[0].keys()} + for result in results: + for demand, candidates in result.items(): + resolved_demands[demand].extend(candidates) + LOG.info('resolved_demands: {}'.format(str(resolved_demands))) + return resolved_demands + def resolve_location(self, ctx, arg): log_util.setLoggerFilter(LOG, ctx.get('keyspace'), ctx.get('plan_id')) diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json b/conductor/conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json index cfe5a78..a21b0ac 100644 --- a/conductor/conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json +++ b/conductor/conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json @@ -6,6 +6,9 @@ "global-customer-id": "customer-123", "service-type": "TEST" }, + "default_attributes": { + "creation_cost": 0.9 + }, "inventory_provider": "generator", "inventory_type": "nssi" } @@ -13,54 +16,71 @@ "urllc": [ { "filtering_attributes": { - "core": { - "latency": { - "max": 20, - "min": 15, - "steps": 1 - }, - "reliability": { - "values": [ - 99.99 - ] + "service_profile": { + "latency": {"value": 20, "operator": "lte"}, + "reliability": {"value": 99.99, "operator": "gte"} + }, + "subnets": { + "core": { + "latency": { + "max": 20, + "min": 15, + "steps": 1 + }, + "reliability": { + "values": [ + 99.99 + ] + } } } }, + "default_attributes": { + "creation_cost": 0.9 + }, "inventory_provider": "generator", "inventory_type": "slice_profiles", "unique": "true" }, { "filtering_attributes": { - "core": { - "latency": { - "max": 20, - "min": 15, - "steps": 1 + "service_profile": { + "latency": {"value": 20, "operator": "lte"}, + "reliability": {"value": 99.99, "operator": "gte"} + }, + "subnets": { + "core": { + "latency": { + "max": 20, + "min": 15, + "steps": 1 + }, + "reliability": { + "values": [ + 99.99 + ] + } }, - "reliability": { - "values": [ - 99.99 - ] - } - }, - "ran": { - "latency": { - "max": 20, - "min": 18, - "steps": 1 - }, - "reliability": { - "values": [ - 99.99 - ] + "ran": { + "latency": { + "max": 20, + "min": 18, + "steps": 1 + }, + "reliability": { + "values": [ + 99.99 + ] + } } } }, + "default_attributes": { + "creation_cost": 0.9 + }, "inventory_provider": "generator", "inventory_type": "slice_profiles", "unique": "true" } ] } - diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json b/conductor/conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json index d4c76f0..135b254 100644 --- a/conductor/conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json +++ b/conductor/conductor/tests/unit/data/plugins/inventory_provider/generated_candidates.json @@ -1,752 +1,317 @@ [ { - "candidate_id": "824df02b-f5eb-4117-bd7b-47262f7834b3", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 25, - "ran_coverage_area_ta_list": "City: Chennai", + "reliability": 99.99, + "coverage_area_ta_list": "City: Chennai", + "core_latency": 15, + "core_reliability": 99.99, "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "9f61ed37-85b4-4735-bd27-a93fef568ec4", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 26, - "ran_coverage_area_ta_list": "City: Chennai", + "reliability": 99.99, + "coverage_area_ta_list": "City: Chennai", + "core_latency": 15, + "core_reliability": 99.99, "ran_latency": 11, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "0c3422c5-2ffb-4b90-8b56-a720b72eff41", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 27, - "ran_coverage_area_ta_list": "City: Chennai", + "reliability": 99.99, + "coverage_area_ta_list": "City: Chennai", + "core_latency": 15, + "core_reliability": 99.99, "ran_latency": 12, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "c52f6046-e4eb-426a-a8bc-e48e333bbcde", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 28, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 13, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "3bd5d9de-e402-4ef3-96ff-d50216925e61", + "coverage_area_ta_list": "City: Chennai", "core_latency": 15, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 29, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 14, + "ran_latency": 13, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "3631066c-c242-431e-a409-dd03a8559926", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 30, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 15, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 29, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "6e5f0c89-95de-4fd2-bd61-4bae1a6f4507", + "coverage_area_ta_list": "City: Chennai", "core_latency": 15, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 31, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 16, + "ran_latency": 14, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "8916ea61-3102-4ed1-a53a-c23a7df5b7d8", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 32, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 17, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 30, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "c151fc74-5602-42c7-9d88-68b4b2ce7a92", + "coverage_area_ta_list": "City: Chennai", "core_latency": 15, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 33, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 18, + "ran_latency": 15, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "25c2d09a-45ca-49eb-ba08-70cc42bc8eb0", - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 34, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 19, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 26, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "86555fc1-d158-4739-8e4a-e34f1c01c9b9", + "coverage_area_ta_list": "City: Chennai", "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 26, - "ran_coverage_area_ta_list": "City: Chennai", "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "31a74478-bd76-4ffc-98eb-e20adc01c4d5", - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 27, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 11, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "948ab1a7-06c0-4f34-ae34-e5df1f5dbcfe", + "coverage_area_ta_list": "City: Chennai", "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 28, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 12, + "ran_latency": 11, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "1c7a4c2b-1fce-4d58-8a7e-fc5d1017608a", - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 29, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 13, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 28, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "b956dce2-a898-4e9c-aa02-9ef5082028c1", + "coverage_area_ta_list": "City: Chennai", "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 30, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 14, + "ran_latency": 12, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "9fa2871e-f7fb-443b-be7b-15b2f2ddeb0a", - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 31, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 15, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 29, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "aa50050c-bece-4f8a-ab09-cfb928da955b", + "coverage_area_ta_list": "City: Chennai", "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 32, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 16, + "ran_latency": 13, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "6a576ba0-3aab-4a53-a318-d850fddc88d5", - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 33, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 17, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 30, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "7313812c-1d53-4a82-919b-50db6f9e69f0", + "coverage_area_ta_list": "City: Chennai", "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 34, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 18, + "ran_latency": 14, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "2f352c9d-9d0d-4017-a547-80124527c08b", - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 35, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 19, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 27, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "fef0e167-3adf-4dd8-8928-05b8eb76f443", + "coverage_area_ta_list": "City: Chennai", "core_latency": 17, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 27, - "ran_coverage_area_ta_list": "City: Chennai", "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "af8e0e30-57ee-410f-a6b0-51b5cb45e066", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 28, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 11, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "e0d4d686-d248-4eda-9910-0bf3a2c6304f", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 29, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 12, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "c297f2a0-c2cb-4dbe-9e44-62c1da8b3df2", "core_latency": 17, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 30, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 13, + "ran_latency": 11, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "d8c247f5-2fc8-4af5-abaf-c86c52795d18", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 31, "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 14, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "candidate_id": "75f7a109-6af2-4f58-bbcf-69da15b49746", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 32, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 15, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 29, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "d1e8b1b8-ce5b-4701-95d7-5df12e51c87b", + "coverage_area_ta_list": "City: Chennai", "core_latency": 17, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 33, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 16, + "ran_latency": 12, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "9654aecf-6923-40b8-b4c1-ee5e08d2c50e", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 34, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 17, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 30, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "359ed468-6ed9-4d72-af19-cbf4c20bde2b", + "coverage_area_ta_list": "City: Chennai", "core_latency": 17, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 35, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 18, + "ran_latency": 13, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "0d91e973-ff9a-4d49-ba29-5f40bf3be902", - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 36, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 19, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 28, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "b7761dc6-fd27-46ec-abb8-c58a7976514f", + "coverage_area_ta_list": "City: Chennai", "core_latency": 18, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 28, - "ran_coverage_area_ta_list": "City: Chennai", "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "24b04d95-649c-4c23-896e-37fb092536c8", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 29, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 11, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "39b7a668-7974-4504-b36b-a6fc875ee05c", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 30, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 12, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "23e4acc0-5414-4b4b-99f8-9669733ca53a", "core_latency": 18, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 31, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 13, + "ran_latency": 11, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "97f29b0b-b21c-424e-bb02-e35fc0b2e43b", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 32, "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 14, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "candidate_id": "2072423a-2b3e-460d-a609-da70602f8f60", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 33, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 15, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "8756ea24-7a29-47a4-9c36-55a87b14193c", - "core_latency": 18, - "core_reliability": 99.99, + "uniqueness": "true", "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 34, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 16, - "ran_reliability": 99.99, + "latency": 30, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "5b1332ec-d241-4063-b09b-a71d10e6b65c", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 35, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 17, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "decce033-4889-476e-be3c-21abbac514fc", "core_latency": 18, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 36, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 18, + "ran_latency": 12, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "1d00cd28-784c-4c44-b718-a533b09d4d72", - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 37, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 19, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, + "latency": 29, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "f0084f21-a268-430a-8642-050aa7e3ad71", + "coverage_area_ta_list": "City: Chennai", "core_latency": 19, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 29, - "ran_coverage_area_ta_list": "City: Chennai", "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "ran_coverage_area_ta_list": "City: Chennai", + "creation_cost": 0.9 }, { - "candidate_id": "669ce118-1e7f-4630-8d72-1a22bc4d3abd", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", + "uniqueness": "true", + "cost": 1.0, "latency": 30, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 11, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "b25a1b05-208b-49a6-9dc5-a65473f81d29", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 31, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 12, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "776754f3-b197-4b66-bcdd-0a03f7bb3fc6", "core_latency": 19, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 32, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 13, + "ran_latency": 11, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "d5765567-6bdf-46b9-8167-214e476476c9", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 33, "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 14, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "candidate_id": "0494bbe3-adea-4eda-b214-f7b7c7214ce3", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 34, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 15, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "9f8882c9-c984-4f24-8a98-2a95d82d23aa", - "core_latency": 19, - "core_reliability": 99.99, + "uniqueness": "true", "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 35, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 16, - "ran_reliability": 99.99, + "latency": 30, "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "e58afc2f-9579-423f-9680-71bc0fd694b4", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 36, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 17, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "b06cea8f-8f0e-4762-8f2c-34405c6ee14c", - "core_latency": 19, + "core_latency": 20, "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 37, - "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 18, + "ran_latency": 10, "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "candidate_id": "1b22b8be-1324-4f2b-a207-916524ef9a86", - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, - "coverage_area_ta_list": "City: Chennai", - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 38, "ran_coverage_area_ta_list": "City: Chennai", - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 } ] diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json b/conductor/conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json index b877cca..ac9c674 100644 --- a/conductor/conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json +++ b/conductor/conductor/tests/unit/data/plugins/inventory_provider/resolved_demands_gen.json @@ -2,174 +2,59 @@ "embb": [], "urllc": [ { - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 15, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "core_latency": 16, - "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 16, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 17, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 18, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "core_latency": 19, - "core_reliability": 99.99, + "uniqueness": "true", "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 19, "reliability": 99.99, - "uniqueness": "true" - }, - { + "latency": 15, "core_latency": 15, "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 33, - "ran_latency": 18, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "core_latency": 15, - "core_reliability": 99.99, - "cost": 1.0, "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 34, - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" - }, - { - "core_latency": 16, - "core_reliability": 99.99, + "uniqueness": "true", "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 34, - "ran_latency": 18, - "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" - }, - { + "latency": 16, "core_latency": 16, "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 35, - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "core_latency": 17, - "core_reliability": 99.99, - "cost": 1.0, "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 35, - "ran_latency": 18, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, "reliability": 99.99, - "uniqueness": "true" - }, - { + "latency": 17, "core_latency": 17, "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 36, - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "core_latency": 18, - "core_reliability": 99.99, - "cost": 1.0, "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 36, - "ran_latency": 18, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, "reliability": 99.99, - "uniqueness": "true" - }, - { + "latency": 18, "core_latency": 18, "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 37, - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 }, { - "core_latency": 19, - "core_reliability": 99.99, - "cost": 1.0, "inventory_provider": "generator", "inventory_type": "slice_profiles", - "latency": 37, - "ran_latency": 18, - "ran_reliability": 99.99, + "uniqueness": "true", + "cost": 1.0, "reliability": 99.99, - "uniqueness": "true" - }, - { + "latency": 19, "core_latency": 19, "core_reliability": 99.99, - "cost": 1.0, - "inventory_provider": "generator", - "inventory_type": "slice_profiles", - "latency": 38, - "ran_latency": 19, - "ran_reliability": 99.99, - "reliability": 99.99, - "uniqueness": "true" + "creation_cost": 0.9 } ] } diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_candidates.py b/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_candidates.py index 1fb8584..8d9bcc5 100644 --- a/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_candidates.py +++ b/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_candidates.py @@ -46,13 +46,15 @@ class TestCandidates(unittest.TestCase): "ran_latency": 10, "ran_reliability": 99.99, "reliability": 99.99, - "uniqueness": "true" + "uniqueness": "true", + "creation_cost": 0.9 } info = Candidate.build_candidate_info("generator", "slice_profiles", 1.0, "true", id) subnet_requirements = {"core": {"latency": 15, "reliability": 99.99}, "ran": {"latency": 10, "reliability": 99.99, "coverage_area_ta_list": "City: Chennai"} } - candidate = SliceProfilesCandidate(info=info, subnet_requirements=subnet_requirements) + candidate = SliceProfilesCandidate(info=info, subnet_requirements=subnet_requirements, + default_fields={"creation_cost": 0.9}) self.assertEqual(expected_candidate, candidate.convert_nested_dict_to_dict()) diff --git a/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_generator.py b/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_generator.py index 76ecd41..2c0f207 100644 --- a/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_generator.py +++ b/conductor/conductor/tests/unit/data/plugins/inventory_provider/test_generator.py @@ -39,26 +39,34 @@ class TestGenerator(unittest.TestCase): generator = Generator() - filtering_attributes = {'core': {'latency': {'min': 15, 'max': 20, 'steps': 1}, - 'reliability': {'values': [99.99]}}, - 'ran': {'latency': {'min': 10, 'max': 20, 'steps': 1}, - 'reliability': {'values': [99.99]}, - 'coverage_area_ta_list': {'values': ['City: Chennai']}}} + filtering_attributes = { + 'service_profile': { + 'latency': {'value': 30, 'operator': 'lte'}, + 'reliability': {'value': 99.99, 'operator': 'gte'}, + 'coverage_area_ta_list': {'value': 'City: Chennai', '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']}} + } + } generated_candidates = generator.generate_candidates('slice_profiles', filtering_attributes, - candidate_uniqueness='true') + candidate_uniqueness='true', + default_fields={"creation_cost": 0.9}) for candidate in generated_candidates: self.assertIsNotNone(candidate['candidate_id']) del candidate['candidate_id'] - for candidate in expected_candidates: - del candidate['candidate_id'] - self.assertCountEqual(expected_candidates, generated_candidates) self.assertEqual([], generator.generate_candidates('cloud', filtering_attributes, - candidate_uniqueness='true')) + candidate_uniqueness='true', + default_fields={"creation_cost": 0.9})) def test_resolve_demands(self): demands_file = './conductor/tests/unit/data/plugins/inventory_provider/gen_demand_list.json' @@ -69,7 +77,7 @@ class TestGenerator(unittest.TestCase): generator = Generator() resolved_demands = generator.resolve_demands(demands, plan_info=None, triage_translator_data=None) - for demand, candidate_list in resolved_demands.items(): + for _, candidate_list in resolved_demands.items(): for candidate in candidate_list: self.assertIsNotNone(candidate['candidate_id']) del candidate['candidate_id'] diff --git a/conductor/setup.cfg b/conductor/setup.cfg index 9d2298d..ee5fcf1 100644 --- a/conductor/setup.cfg +++ b/conductor/setup.cfg @@ -67,6 +67,7 @@ console_scripts = conductor.inventory_provider.plugin = aai = conductor.data.plugins.inventory_provider.aai:AAI + generator = conductor.data.plugins.inventory_provider.generator:Generator conductor.vim_controller.plugin = multicloud = conductor.data.plugins.vim_controller.multicloud:MULTICLOUD -- cgit 1.2.3-korg