Functest scripts, simulators, and payloads
[optf/osdf.git] / osdf / optimizers / placementopt / conductor / api_builder.py
index 0a874f7..b2a5bf7 100644 (file)
 # -------------------------------------------------------------------------
 #
 
-import copy
 import json
-# from osdf.utils import data_mapping
+
 from jinja2 import Template
-from osdf.utils.programming_utils import list_flatten, dot_notation
+
 import osdf.optimizers.placementopt.conductor.translation as tr
-from osdf.adapters.policy.utils import group_policies
+from osdf.adapters.policy.utils import group_policies_gen
+from osdf.utils.programming_utils import list_flatten
 
 
-def conductor_api_builder(request_json, flat_policies: list, local_config, prov_status,
-                          template="templates/conductor_interface.json"):
-    """Build a SNIRO southbound API call for Conductor/Placement optimization
+def conductor_api_builder(request_json, flat_policies: list, local_config,
+                          template="osdf/templates/conductor_interface.json"):
+    """Build an OSDF southbound API call for HAS-Conductor/Placement optimization
     :param request_json: parameter data received from a client
     :param flat_policies: policy data received from the policy platform (flat policies)
     :param template: template to generate southbound API call to conductor
@@ -36,13 +36,13 @@ def conductor_api_builder(request_json, flat_policies: list, local_config, prov_
     :return: json to be sent to Conductor/placement optimization
     """
     templ = Template(open(template).read())
-    gp = group_policies(flat_policies)
+    gp = group_policies_gen(flat_policies, local_config)
     demand_vnf_name_list = []
 
-    for placementDemand in request_json['placementInfo']['demandInfo']['placementDemand']:
+    for placementDemand in request_json['placementInfo']['placementDemands']:
         demand_vnf_name_list.append(placementDemand['resourceModuleName'])
 
-    demand_list = tr.gen_demands(request_json['placementInfo']['demandInfo'], gp['vnfPolicy'])
+    demand_list = tr.gen_demands(request_json, gp['vnfPolicy'])
     attribute_policy_list = tr.gen_attribute_policy(demand_vnf_name_list, gp['attribute'])
     distance_to_location_policy_list = tr.gen_distance_to_location_policy(
         demand_vnf_name_list, gp['distance_to_location'])
@@ -53,71 +53,26 @@ def conductor_api_builder(request_json, flat_policies: list, local_config, prov_
     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']
-    model_name = request_json['placementInfo']['serviceModelInfo']['modelName']
-    service_type = model_name
-    # service_type = data_mapping.get_service_type(model_name)
-    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"])
     request_type = req_info.get('requestType', None)
-    subs_com_site_id = ""
-    if 'subscriberInfo' in request_json['placementInfo']: 
-        subs_com_site_id = request_json['placementInfo']['subscriberInfo'].get('subscriberCommonSiteId', "")
-    if service_type == 'vCPE':
-        # data_mapping.normalize_user_params(order_info)
-        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,
-            name=req_info['requestId'],
-            timeout=req_info['timeout'],
-            limit=req_info['numSolutions'],
-            serviceType=service_type,
-            serviceInstance=request_json['placementInfo']['serviceInstanceId'],
-            provStatus = prov_status,
-            chosenRegion=order_info.get('requestParameters',{}).get('lcpCloudRegionId'),
-            json=json)
-    elif service_type == 'UNKNOWN':
-        rendered_req = templ.render(
-            requestType=request_type,
-            chosenComplex=subs_com_site_id,
-            demand_list=demand_list,
-            policy_groups=policy_groups,
-            reservation_groups=reservation_groups,
-            optimization_policies=optimization_policy_list,
-            name=req_info['requestId'],
-            timeout=req_info['timeout'],
-            limit=req_info['numSolutions'],
-            serviceType=service_type,
-            serviceInstance=request_json['placementInfo']['serviceInstanceId'],
-            provStatus = prov_status,
-            # process order data
-            bandwidth=dot_notation(order_info, service_info['bandwidth']),
-            bandwidth_unit=dot_notation(order_info, service_info['bandwidth_units']),
-            json=json)
-    json_payload = json.dumps(json.loads(rendered_req)) # need this because template's JSON is ugly!
+    rendered_req = templ.render(
+        requestType=request_type,
+        demand_list=demand_list,
+        policy_groups=policy_groups,
+        optimization_policies=optimization_policy_list,
+        name=req_info['requestId'],
+        timeout=req_info['timeout'],
+        limit=req_info['numSolutions'],
+        service_type=request_json['serviceInfo']['serviceName'],
+        service_id=request_json['serviceInfo']['serviceInstanceId'],
+        provStatus="",
+        json=json)
+    json_payload = json.dumps(json.loads(rendered_req))  # need this because template's JSON is ugly!
     return json_payload
-
-
-def retrieve_node(req_json, reference):
-    """
-    Get the child node(s) from the dot-notation [reference] and parent [req_json].
-    For placement and other requests, there are encoded JSONs inside the request or policy,
-    so we need to expand it and then do a search over the parent plus expanded JSON.
-    """
-    req_json_copy = copy.deepcopy(req_json)  # since we expand the JSON in place, we work on a copy
-    if 'orderInfo' in req_json_copy['placementInfo']:
-        req_json_copy['placementInfo']['orderInfo'] = json.loads(req_json_copy['placementInfo']['orderInfo'])
-    info = dot_notation(req_json_copy, reference)
-    return list_flatten(info) if isinstance(info, list) else info
-