Updated the conductor adaptor code.
Issue-ID: OPTFRA-207
Change-Id: I41bd6f2e39bc5ca6d2d27539772175363590416f
Signed-off-by: Ankitkumar Patel <ankit@research.att.com>
zone_policy_list = tr.gen_zone_policy(demand_vnf_name_list, gp['zone'])
optimization_policy_list = tr.gen_optimization_policy(demand_vnf_name_list, gp['placementOptimization'])
reservation_policy_list = tr.gen_reservation_policy(demand_vnf_name_list, gp['instance_reservation'])
+ capacity_policy_list = tr.gen_capacity_policy(demand_vnf_name_list, gp['vim_fit'])
+ hpa_policy_list = tr.gen_hpa_policy(demand_vnf_name_list, gp['hpa'])
conductor_policies = [attribute_policy_list, distance_to_location_policy_list, inventory_policy_list,
- resource_instance_policy_list, resource_region_policy_list, zone_policy_list]
+ resource_instance_policy_list, resource_region_policy_list, zone_policy_list,
+ reservation_policy_list, capacity_policy_list, hpa_policy_list]
filtered_policies = [x for x in conductor_policies if len(x) > 0]
policy_groups = list_flatten(filtered_policies)
- reservation_policies = [x for x in reservation_policy_list if len(x) > 0]
- reservation_groups = list_flatten(reservation_policies)
req_info = request_json['requestInfo']
request_type = req_info.get('requestType', None)
- service_type = request_json['serviceInfo']['serviceName']
- service_info = local_config.get('service_info', {}).get(service_type, {})
- order_info = {}
- if 'orderInfo' in request_json["placementInfo"]:
- order_info = json.loads(request_json["placementInfo"]["orderInfo"])
-
- subs_com_site_id = ""
- if 'subscriberInfo' in request_json['placementInfo']:
- subs_com_site_id = request_json['placementInfo']['subscriberInfo'].get('subscriberCommonSiteId', "")
rendered_req = templ.render(
requestType=request_type,
- chosenComplex=subs_com_site_id,
demand_list=demand_list,
policy_groups=policy_groups,
optimization_policies=optimization_policy_list,
service_type=request_json['serviceInfo']['serviceName'],
service_id=request_json['serviceInfo']['serviceInstanceId'],
provStatus="",
- chosenRegion=order_info.get('requestParameters', {}).get('lcpCloudRegionId'),
json=json)
json_payload = json.dumps(json.loads(rendered_req)) # need this because template's JSON is ugly!
return json_payload
from osdf.operation.exceptions import BusinessException
-def request(req_object, osdf_config, grouped_policies, prov_status):
+def request(req_object, osdf_config, grouped_policies):
"""
Process a placement request from a Client (build Conductor API call, make the call, return result)
:param req_object: Request parameters from the client
ping_wait_time = config.get('conductorPingWaitTime', 60)
rc = RestClient(userid=uid, passwd=passwd, method="GET", log_func=debug_log.debug, headers=headers)
- conductor_req_json_str = conductor_api_builder(req_object, grouped_policies, local_config, prov_status)
+ conductor_req_json_str = conductor_api_builder(req_object, grouped_policies, local_config)
conductor_req_json = json.loads(conductor_req_json_str)
debug_log.debug("Sending first Conductor request for request_id {}".format(req_id))
from osdf.utils.interfaces import get_rest_client
-def process_placement_opt(request_json, policies, osdf_config, prov_status):
+def process_placement_opt(request_json, policies, osdf_config):
"""Perform the work for placement optimization (e.g. call SDC artifact and make conductor request)
NOTE: there is scope to make the requests to policy asynchronous to speed up overall performance
:param request_json: json content from original request
# Conductor only handles placement, only call Conductor if placementDemands exist
if request_json.get('licenseInfo', {}).get('licenseDemands'):
metrics_log.info(MH.requesting("placement/conductor", req_id))
- placement_response = conductor.request(request_json, osdf_config, policies, prov_status)
+ placement_response = conductor.request(request_json, osdf_config, policies)
if license_info: # Attach license solution if it exists
placement_response['solutionInfo']['licenseInfo'] = license_info
else: # License selection only scenario
return optimization_policy_list
-def get_matching_vnf(resource, vnf_list):
-
- for vnf in vnf_list:
- if resource in vnf:
- return vnf
- return resource
-
-
def get_matching_vnfs(resources, vnf_list, match_type="intersection"):
"""Get a list of matching VNFs from the list of resources
:param resources:
return cur_policies
+def gen_capacity_policy(vnf_list, capacity_policy):
+ """Get zone policies in order to populate the Conductor API call"""
+ cur_policies, related_policies = gen_policy_instance(vnf_list, capacity_policy, rtype=None)
+ for p_new, p_main in zip(cur_policies, related_policies): # add additional fields to each policy
+ pmz = p_main['content']['capacityProperty']
+ p_new[p_main['content']['identity']]['properties'] = \
+ {"controller": pmz['controller'], 'request': json.loads(pmz['request'])}
+ return cur_policies
+
+
+def gen_hpa_policy(vnf_list, hpa_policy):
+ """Get zone policies in order to populate the Conductor API call"""
+ cur_policies, related_policies = gen_policy_instance(vnf_list, hpa_policy, rtype=None)
+ for p_new, p_main in zip(cur_policies, related_policies): # add additional fields to each policy
+ p_new[p_main['content']['identity']]['properties'] = {'evaluate': p_main['content']['flavorFeatures']}
+ return cur_policies
+
+
def get_augmented_policy_attributes(policy_property, demand):
"""Get policy attributes and augment them using policy_config_mapping and demand information"""
attributes = copy.copy(policy_property['attributes'])
"timeout": {{ timeout }},\r
"limit": {{ limit }},\r
"template": {\r
- "homing_template_version": "2017-10-10",\r
+ "homing_template_version": "2018-02-01",\r
"parameters": {\r
"service_name": "{{ service_name }}",\r
"service_id": "{{ service_id }}",\r
"customer_lat": "{{ latitude }}",\r
- "customer_long": "{{ longitude }}",\r
- "REQUIRED_MEM": "{{ memory }}",\r
- "REQUIRED_DISK": "{{ storage }}"\r
+ "customer_long": "{{ longitude }}"\r
},\r
"locations": {\r
"customer_loc": {\r
PlacementAPI(request_json).validate()
policies = get_policies(request_json, "placement")
audit_log.info(MH.new_worker_thread(req_id, "[for placement]"))
- t = Thread(target=process_placement_opt, args=(request_json, policies, osdf_config, ""))
+ t = Thread(target=process_placement_opt, args=(request_json, policies, osdf_config))
t.start()
audit_log.info(MH.accepted_valid_request(req_id, request))
return osdf.operation.responses.osdf_response_for_request_accept(
"resources": ["vGMuxInfra"],
"capacityProperty": {
"controller": "multicloud",
- "request": "{\"vCPU\": 10, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\", \"unit\": \"GB\"}}}"
+ "request": "{\"vCPU\": 10, \"Memory\": {\"quantity\": 16, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": 40, \"unit\": \"GB\"}}"
},
"policyType": "vim_fit",
"applicableResources": "any"
"resources": ["vG"],
"capacityProperty": {
"controller": "multicloud",
- "request": "{\"vCPU\": 10, \"Memory\": {\"quantity\": {\"get_param\": \"REQUIRED_MEM\"}, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": {\"get_param\": \"REQUIRED_DISK\", \"unit\": \"GB\"}}}"
+ "request": "{\"vCPU\": 10, \"Memory\": {\"quantity\": 16, \"unit\": \"GB\"}, \"Storage\": {\"quantity\": 40, \"unit\": \"GB\"}}"
},
"policyType": "vim_fit",
"applicableResources": "any"
--- /dev/null
+Affinity_vCPE_1.json
+Capacity_1.json
+Distance_vGMuxInfra_1.json
+Distance_vG_1.json
+Min_Guarantee_vGMuxInfra_1.json
+Placement_Optimization_1.json
+QueryPolicy_vCPE.json
+hpa_policy_vGMuxInfra_1.json
+hpa_policy_vG_1.json
+subscriber_policy.json
+vnfPolicy_vG.json
+vnfPolicy_vGMuxInfra.json
+
+
"riskLevel": "2",
"guard": "False",
"content": {
- "resources": "vGMuxInfra",
+ "resources": ["vGMuxInfra"],
"identity": "hpaPolicy_vGMuxInfra",
"policyScope": ["vCPE", "US", "INTERNATIONAL", "ip", "vGMuxInfra", "hpaPolicy"],
- "policyType": "hpaPolicy",
+ "policyType": "hpa",
"flavorFeatures": [
{
"flavorLabel": "flavor_label_vm_01",
"riskLevel": "2",
"guard": "False",
"content": {
- "resources": "vG",
+ "resources": ["vG"],
"identity": "hpaPolicy_vG",
"policyScope": ["vCPE", "US", "INTERNATIONAL", "ip", "vG", "hpaPolicy"],
- "policyType": "hpaPolicy",
+ "policyType": "hpa",
"flavorFeatures": [
{
"flavorLabel": "flavor_label_vm_01",
request_json = json_from_file(parameter_data_file)
policies = [json_from_file(policy_data_path + '/' + name) for name in valid_policies_files]
local_config = yaml_from_file(local_config_file)
- templ_string = process_placement_opt(request_json, policies, local_config, [])
+ templ_string = process_placement_opt(request_json, policies, local_config)
if __name__ == "__main__":