Merge "Policy model for PCI optimization"
authorDileep Ranganathan <dileep.ranganathan@intel.com>
Fri, 28 Sep 2018 16:27:57 +0000 (16:27 +0000)
committerGerrit Code Review <gerrit@onap.org>
Fri, 28 Sep 2018 16:27:57 +0000 (16:27 +0000)
14 files changed:
config/osdf_config.yaml
osdf/__init__.py
osdf/optimizers/pciopt/pci_opt_processor.py
osdf/optimizers/placementopt/conductor/conductor.py
osdf/optimizers/routeopt/__init__.py [new file with mode: 0644]
osdf/optimizers/routeopt/simple_route_opt.py
osdfapp.py
test/functest/simulators/policy/response-payloads/pdp-has-vcpe-good/hpa_policy_vGMuxInfra_1.json
test/functest/simulators/policy/response-payloads/pdp-has-vcpe-good/hpa_policy_vG_1.json
test/pci-optimization-tests/request.json
test/placement-tests/conductor_response.json
test/placement-tests/response.json
test/policy-local-files/hpa_policy_vGMuxInfra_1.json
test/policy-local-files/hpa_policy_vG_1.json

index 636b6ad..c484fb4 100755 (executable)
@@ -81,3 +81,7 @@ configDbGetNbrListUrl: 'SDNCConfigDBAPI/getNbrList'
 # Credentials for PCIHandler
 pciHMSUsername: ""   # pcihandler username for call back.
 pciHMSPassword: ""   # pcihandler password for call back.
+
+# Credentials for the OOF PCI Opt service
+osdfPCIOptUsername: pci_test
+osdfPCIOptPassword: pci_testpwd
index 5d15a85..c33639e 100755 (executable)
@@ -24,6 +24,7 @@ from jinja2 import Template
 end_point_auth_mapping = {  # map a URL endpoint to auth group
     "cmscheduler": "CMScheduler",
     "placement": "Placement",
+    "pci": "PCIOpt"
 }
 
 userid_suffix, passwd_suffix = "Username", "Password"
index 030128e..989f578 100644 (file)
@@ -20,7 +20,6 @@ import traceback
 from requests import RequestException
 
 from osdf.logging.osdf_logging import metrics_log, MH, error_log
-from osdf.models.api.pciOptimizationResponse import PCIOptimizationResponse, Solution, PCISolution
 from osdf.operation.error_handling import build_json_error_body
 from osdf.utils.interfaces import get_rest_client
 from .configdb import request as config_request
@@ -44,26 +43,9 @@ def process_pci_optimation(request_json, osdf_config, flat_policies):
     try:
         rc = get_rest_client(request_json, service="pcih")
         req_id = request_json["requestInfo"]["requestId"]
-        transaction_id = request_json['requestInfo']['transactionId']
         cell_info_list, network_cell_info = config_request(request_json, osdf_config, flat_policies)
 
-        pci_response = PCIOptimizationResponse()
-        pci_response.transactionId = transaction_id
-        pci_response.requestId = req_id
-        pci_response.requestStatus = 'success'
-        pci_response.solutions = Solution()
-        pci_response.solutions.networkId = request_json['cellInfo']['networkId']
-        pci_response.solutions.pciSolutions = []
-
-        for cell in request_json['cellInfo']['cellIdList']:
-            pci_solution = optimize(cell['cellId'], network_cell_info, cell_info_list)
-            error_log.error(pci_solution)
-            sol = pci_solution[0]['pci']
-            for k, v in sol.items():
-                response = PCISolution()
-                response.cellId = get_cell_id(network_cell_info, k)
-                response.pci = get_pci_value(network_cell_info, v)
-                pci_response.solutions.pciSolutions.append(response)
+        pci_response = get_solutions(cell_info_list, network_cell_info, request_json)
 
         metrics_log.info(MH.inside_worker_thread(req_id))
     except Exception as err:
@@ -82,3 +64,32 @@ def process_pci_optimation(request_json, osdf_config, flat_policies):
         rc.request(json=pci_response, noresponse=True)
     except RequestException:  # can't do much here but log it and move on
         error_log.error("Error sending asynchronous notification for {} {}".format(req_id, traceback.format_exc()))
+
+
+def get_solutions(cell_info_list, network_cell_info, request_json):
+    return {
+        "transactionId": request_json['requestInfo']['transactionId'],
+        "requestId": request_json["requestInfo"]["requestId"],
+        "requestStatus": "completed",
+        "statusMessage": "success",
+        "solutions": [
+            {
+                'networkId': request_json['cellInfo']['networkId'],
+                'pciSolutions': build_solution_list(cell_info_list, network_cell_info, request_json)
+            }
+        ]
+    }
+
+
+def build_solution_list(cell_info_list, network_cell_info, request_json):
+    solution_list = []
+    for cell in request_json['cellInfo']['cellIdList']:
+        opt_solution = optimize(cell, network_cell_info, cell_info_list)
+        sol = opt_solution[0]['pci']
+        for k, v in sol.items():
+            response = {
+                'cellId': get_cell_id(network_cell_info, k),
+                'pci': get_pci_value(network_cell_info, v)
+            }
+            solution_list.append(response)
+    return solution_list
index 29f0bbc..357efd1 100755 (executable)
@@ -136,7 +136,7 @@ def conductor_response_processor(conductor_response, raw_response, req_id):
     name_map = {"physical-location-id": "cloudClli", "host_id": "vnfHostName",\r
                 "cloud_version": "cloudVersion", "cloud_owner": "cloudOwner",\r
                 "cloud": "cloudRegionId", "service": "serviceInstanceId", "is_rehome": "isRehome",\r
-                "location_id": "locationId", "location_type": "locationType"}\r
+                "location_id": "locationId", "location_type": "locationType", "directives": "oof_directives"}\r
     for reco in conductor_response['plans'][0]['recommendations']:\r
         for resource in reco.keys():\r
             c = reco[resource]['candidate']\r
diff --git a/osdf/optimizers/routeopt/__init__.py b/osdf/optimizers/routeopt/__init__.py
new file mode 100644 (file)
index 0000000..c235f2a
--- /dev/null
@@ -0,0 +1,17 @@
+# -------------------------------------------------------------------------
+#   Copyright (c) 2018 Huawei Intellectual Property
+#
+#   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.
+#
+# -------------------------------------------------------------------------
+#
index d1cf13f..ed179c9 100644 (file)
@@ -32,6 +32,7 @@ class RouteOpt:
     aai_headers = {
         "X-TransactionId": "9999",
         "X-FromAppId": "OOF",
+        "Accept": "application/json",
         "Content-Type": "application/json",
         "Real-Time": "true"
     }
@@ -42,10 +43,9 @@ class RouteOpt:
         :param logical_link:
         :return:
         """
-        for relationship in logical_link["logical-links"]["relationship-list"]["relationship"]:
-            if relationship["related-to"] == "p-interface":
-                if "ext-aai-network" in relationship["related-link"]:
-                    return True
+        for relationship in logical_link["relationship-list"]["relationship"]:
+            if relationship["related-to"] == "external-aai-network":
+                return True
         return False
 
     def getRoute(self, request):
@@ -62,21 +62,8 @@ class RouteOpt:
         ingress_p_interface = None
         egress_p_interface = None
 
-        logical_links = self.get_logical_links()
-
-        # take the logical link where both the p-interface in same onap
-        if logical_links != None:
-            for logical_link in logical_links["results"]:
-                if not self.isCrossONAPLink(logical_link):
-
-                    # link is in local ONAP
-                    for relationship in logical_link["logical-links"]["relationship-list"]["relationship"]:
-                        if relationship["related-to"] == "p-interface":
-                            if src_access_node_id in relationship["related-link"]:
-                                ingress_p_interface = relationship["related-link"].split("/")[-1]
-                            if dst_access_node_id in relationship["related-link"]:
-                                egress_p_interface = relationship["related-link"].split("/")[-1]
-
+        # for the case of request_json for same domain, return the same node with destination update
+        if src_access_node_id == dst_access_node_id:
             data = '{'\
                 '"vpns":['\
                     '{'\
@@ -85,20 +72,48 @@ class RouteOpt:
                         '"access-provider-id": "' + request["srcPort"]["src-access-provider-id"]+ '",'\
                         '"access-node-id": "' + request["srcPort"]["src-access-node-id"]+ '",'\
                         '"src-access-ltp-id": "' + request["srcPort"]["src-access-ltp-id"]+ '",'\
-                        '"dst-access-ltp-id": "' + ingress_p_interface +'"'\
-                    '},'\
-                    '{' \
-                        '"access-topology-id": "' + request["dstPort"]["dst-access-topology-id"] + '",' \
-                        '"access-topology-id": "' + request["dstPort"]["dst-access-topology-id"]+ '",' \
-                        '"access-provider-id": "' + request["dstPort"]["dst-access-provider-id"]+ '",' \
-                        '"access-node-id": "' + request["dstPort"]["dst-access-node-id"]+ '",' \
-                        '"src-access-ltp-id": "' + egress_p_interface + '",' \
-                        '"dst-access-ltp-id": "' + request["dstPort"]["dst-access-ltp-id"] + '"' \
+                        '"dst-access-ltp-id": "' + request["dstPort"]["dst-access-ltp-id"]  +'"'\
                     '}'\
                 ']'\
             '}'
             return data
-
+        else:
+            logical_links = self.get_logical_links()
+
+            # take the logical link where both the p-interface in same onap
+            if logical_links != None:
+                for logical_link in logical_links.get("logical-link"):
+                    if not self.isCrossONAPLink(logical_link):
+                        # link is in local ONAP
+                        for relationship in logical_link["relationship-list"]["relationship"]:
+                            if relationship["related-to"] == "p-interface":
+                                if src_access_node_id in relationship["related-link"]:
+                                    i_interface = relationship["related-link"].split("/")[-1]
+                                    ingress_p_interface = i_interface.split("-")[-1]
+                                if dst_access_node_id in relationship["related-link"]:
+                                    e_interface = relationship["related-link"].split("/")[-1]
+                                    egress_p_interface = e_interface.split("-")[-1]
+                        data = '{'\
+                                '"vpns":['\
+                                        '{'\
+                                        '"access-topology-id": "' + request["srcPort"]["src-access-topology-id"] + '",'\
+                                        '"access-client-id": "' + request["srcPort"]["src-access-client-id"] + '",'\
+                                        '"access-provider-id": "' + request["srcPort"]["src-access-provider-id"]+ '",'\
+                                        '"access-node-id": "' + request["srcPort"]["src-access-node-id"]+ '",'\
+                                        '"src-access-ltp-id": "' + request["srcPort"]["src-access-ltp-id"]+ '",'\
+                                        '"dst-access-ltp-id": "' + ingress_p_interface +'"'\
+                                '},'\
+                                '{' \
+                                        '"access-topology-id": "' + request["dstPort"]["dst-access-topology-id"] + '",' \
+                                        '"access-topology-id": "' + request["dstPort"]["dst-access-topology-id"]+ '",' \
+                                        '"access-provider-id": "' + request["dstPort"]["dst-access-provider-id"]+ '",' \
+                                        '"access-node-id": "' + request["dstPort"]["dst-access-node-id"]+ '",' \
+                                        '"src-access-ltp-id": "' + egress_p_interface + '",' \
+                                        '"dst-access-ltp-id": "' + request["dstPort"]["dst-access-ltp-id"] + '"' \
+                                '}'\
+                            ']'\
+                        '}'
+                        return data
 
 
     def get_pinterface(self, url):
@@ -109,7 +124,8 @@ class RouteOpt:
         aai_req_url = self.aai_host + url
         response = requests.get(aai_req_url,
                                 headers=self.aai_headers,
-                                auth=HTTPBasicAuth("", ""))
+                                auth=HTTPBasicAuth("AAI", "AAI"),
+                                verify=False)
 
         if response.status_code == 200:
             return response.json()
@@ -121,12 +137,14 @@ class RouteOpt:
         from /aai/v14/network/logical-links?operation-status="Up"
         :return: logical-links[]
         """
-        logical_link_url = "/aai/v14/network/logical-links?operation-status=\"Up\""
+        logical_link_url = "/aai/v13/network/logical-links?operational-status=up"
         aai_req_url = self.aai_host + logical_link_url
 
         response = requests.get(aai_req_url,
                      headers=self.aai_headers,
-                     auth=HTTPBasicAuth("", ""))
+                     auth=HTTPBasicAuth("AAI", "AAI"),
+                     verify=False)
 
+        logical_links =  None
         if response.status_code == 200:
             return response.json()
\ No newline at end of file
index 1e076f1..c28e14c 100755 (executable)
@@ -34,15 +34,15 @@ import osdf.config.loader
 import osdf.operation.error_handling
 import osdf.operation.responses
 import traceback
+from schematics.exceptions import DataError
+from requests import RequestException
+from optparse import OptionParser
 from osdf.adapters.policy.interface import get_policies
 from osdf.config.base import osdf_config
 from osdf.optimizers.placementopt.conductor.remote_opt_processor import process_placement_opt
 from osdf.webapp.appcontroller import auth_basic
-from optparse import OptionParser
 from osdf.operation.exceptions import BusinessException
 from osdf.operation.error_handling import request_exception_to_json_body, internal_error_message
-from requests import RequestException
-from schematics.exceptions import DataError
 from osdf.logging.osdf_logging import MH, audit_log, error_log, debug_log
 from osdf.models.api.placementRequest import PlacementAPI
 from osdf.models.api.pciOptimizationRequest import PCIOptimizationAPI
@@ -145,32 +145,7 @@ def do_route_calc():
     """
     request_json = request.get_json()
     audit_log.info("Calculate Route request received!")
-    src_access_node_id = ""
-    dst_access_node_id = ""
-    try:
-        src_access_node_id = request_json["srcPort"]["src-access-node-id"]
-        audit_log.info( src_access_node_id )
-        dst_access_node_id = request_json["dstPort"]["dst-access-node-id"]
-    except Exception as ex:
-        error_log.error("Exception while retriving the src and dst node info")
-    # for the case of request_json for same domain, return the same node with destination update
-    if src_access_node_id == dst_access_node_id:
-        audit_log.info("src and dst are same")
-        data = '{'\
-                '"vpns":['\
-                    '{'\
-                        '"access-topology-id": "' + request_json["srcPort"]["src-access-topology-id"] + '",'\
-                        '"access-client-id": "' + request_json["srcPort"]["src-access-client-id"] + '",'\
-                        '"access-provider-id": "' + request_json["srcPort"]["src-access-provider-id"]+ '",'\
-                        '"access-node-id": "' + request_json["srcPort"]["src-access-node-id"]+ '",'\
-                        '"src-access-ltp-id": "' + request_json["srcPort"]["src-access-ltp-id"]+ '",'\
-                        '"dst-access-ltp-id": "' + request_json["dstPort"]["dst-access-ltp-id"]  +'"'\
-                    '}'\
-                ']'\
-            '}'
-        return data
-    else:
-        return RouteOpt.getRoute(request_json)
+    return RouteOpt().getRoute(request_json)
 
 @app.route("/api/oof/v1/pci", methods=["POST"])
 @auth_basic.login_required
@@ -180,15 +155,17 @@ def do_pci_optimization():
     g.request_id = req_id
     audit_log.info(MH.received_request(request.url, request.remote_addr, json.dumps(request_json)))
     PCIOptimizationAPI(request_json).validate()
-    policies = get_policies(request_json, "pciopt")
+    #disable policy retrieval
+    # policies = get_policies(request_json, "pciopt")
     audit_log.info(MH.new_worker_thread(req_id, "[for pciopt]"))
-    t = Thread(target=process_pci_optimation, args=(request_json, policies, osdf_config))
+    t = Thread(target=process_pci_optimation, args=(request_json, osdf_config, None))
     t.start()
     audit_log.info(MH.accepted_valid_request(req_id, request))
     return req_accept(request_id=req_id,
                       transaction_id=request_json['requestInfo']['transactionId'],
                       request_status="accepted", status_message="")
 
+
 @app.errorhandler(500)
 def internal_failure(error):
     """Returned when unexpected coding errors occur during initial synchronous processing"""
@@ -197,7 +174,6 @@ def internal_failure(error):
     response.status_code = 500
     return response
 
-
 def get_options(argv):
     program_version_string = '%%prog %s' % "v1.0"
     program_longdesc = ""
index da4ef03..85b1e82 100644 (file)
       "policyType": "hpaPolicy",
       "flavorFeatures": [
         {
-          "flavorLabel": "flavor_label_vm_01",
+          "id": "vgmux_1",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_01",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuTopology",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "2","operator": ">=", "unit": ""},
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "4","operator": "<=", "unit": ""},
@@ -34,6 +47,7 @@
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
@@ -44,6 +58,7 @@
               "mandatory" : "False",
               "score" : "3",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key":"dataProcessingAccelerationLibrary", "hpa-attribute-value":"ovsDpdk_version", "operator": "=", "unit":""}
               ]
@@ -52,6 +67,7 @@
               "hpa-feature" : "cpuInstructionSetExtensions",
               "mandatory" : "True",
               "architecture": "INTEL-64",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"instructionSetExtensions", "hpa-attribute-value":["<CPUINST>", "<CPUINST>"], "operator": "ALL", "unit":""}
               ]
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_02",
+          "id": "vgmux_2",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_02",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuPinningy",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"logicalCpuThreadPinningPolicy", "hpa-attribute-value":"<CPUTHREADPOLICY>", "operator": "=", "unit":""},
                 {"hpa-attribute-key":"logicalCpuPinningPolicy", "hpa-attribute-value": "<CPUPOLICY>","operator": "=", "unit":""}
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "diskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
                 {"hpa-attribute-key": "ephemeralDiskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
               "hpa-feature" : "pcie",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "pciCount", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "pciVendorId", "hpa-attribute-value":"8086", "operator": "=", "unit": ""},
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_03",
+          "id": "vgmux_3",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_03",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "numa",
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numaNodes", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "numaCpu-0", "hpa-attribute-value":"2", "operator": "=", "unit": ""},
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "7",
               "architecture": "generic",
+              "directives":[],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key": "memoryPageSize", "hpa-attribute-value": "<MEMORYPAGESIZE>", "operator": "=", "unit": ""}
               ]
index f50ed6d..262ffe7 100644 (file)
       "policyType": "hpaPolicy",
       "flavorFeatures": [
         {
-          "flavorLabel": "flavor_label_vm_01",
+          "id": "vg_1",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_01",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuTopology",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "2","operator": ">=", "unit": ""},
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "4","operator": "<=", "unit": ""},
@@ -34,6 +47,7 @@
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
@@ -44,6 +58,7 @@
               "mandatory" : "False",
               "score" : "3",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key":"dataProcessingAccelerationLibrary", "hpa-attribute-value":"ovsDpdk_version", "operator": "=", "unit":""}
               ]
@@ -52,6 +67,7 @@
               "hpa-feature" : "cpuInstructionSetExtensions",
               "mandatory" : "True",
               "architecture": "INTEL-64",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"instructionSetExtensions", "hpa-attribute-value":["<CPUINST>", "<CPUINST>"], "operator": "ALL", "unit":""}
               ]
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_02",
+          "id": "vg_2",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_02",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuPinningy",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"logicalCpuThreadPinningPolicy", "hpa-attribute-value":"<CPUTHREADPOLICY>", "operator": "=", "unit":""},
                 {"hpa-attribute-key":"logicalCpuPinningPolicy", "hpa-attribute-value": "<CPUPOLICY>","operator": "=", "unit":""}
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "diskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
                 {"hpa-attribute-key": "ephemeralDiskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
               "hpa-feature" : "pcie",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [
+                {
+                  "type": "pcie_directives",
+                  "attributes": [
+                    {
+                      "attribute_name": "<pcie_label_name>",
+                      "attribute_value": "<value for pcie network>"
+                    }
+                  ]
+                }
+              ],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "pciCount", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "pciVendorId", "hpa-attribute-value":"8086", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "pciDeviceId", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
-                {"hpa-attribute-key": "functionType", "hpa-attribute-value": "<PCITYPEVALUE>","operator": "=", "unit": ""}
+                {"hpa-attribute-key": "physicalNetwork", "hpa-attribute-value": "<PCITYPEVALUE>","operator": "=", "unit": ""}
               ]
             }
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_03",
+          "id": "vg_3",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_03",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "numa",
               "mandatory" : "False",
               "score" : "5",
+              "directives": [],
               "architecture": "generic",
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numaNodes", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "7",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key": "memoryPageSize", "hpa-attribute-value": "<MEMORYPAGESIZE>", "operator": "=", "unit": ""}
               ]
index 79c98c3..7ec9ab5 100644 (file)
@@ -14,9 +14,7 @@
   "cellInfo": {
     "networkId": "1000",
     "cellIdList": [
-      {
-        "cellId": "cell0"
-      }
+      "cell0"
     ]
   }
 }
\ No newline at end of file
index e7037c2..ee38ce9 100644 (file)
               "location_type": "openstack-cloud"
             },
             "attributes": {
-              "flavors": {
-                "flavor_label_1": "vim_flavor_X",
-                "flavor_label_2": "vim_flavor_Y"
+              "directives": {
+                "directives": [
+                {
+                  "id": "vFW_0",
+                  "type": "<vnfc/tocsa.nodes.nfv.Vdu.Compute>",
+                  "directives": [
+                    {
+                      "type": "flavor_directives",
+                      "attributes": [
+                        {
+                          "attribute_name": "oof_returned_flavor_label_for_firewall",
+                          "attribute_value": "vim_flavor_X"
+                        }
+                      ]
+                    },
+                    {
+                      "type": "sriovNICNetwork_directives",
+                      "attributes": [
+                        {
+                          "attribute_name": "oof_returned_vnic_type_for_firewall_protected",
+                          "attribute_value": "direct"
+                        },
+                        {
+                          "attribute_name": "oof_returned_provider_network_for_firewall_protected",
+                          "attribute_value": "physnet1"
+                        }
+                      ]
+                    },
+                    {
+                      "type": "sriovNICNetwork_directives",
+                      "attributes": [
+                        {
+                          "attribute_name": "oof_returned_vnic_type_for_firewall_unprotected",
+                          "attribute_value": "direct"
+                        },
+                        {
+                          "attribute_name": "oof_returned_provider_network_for_firewall_unprotected",
+                          "attribute_value": "physnet2"
+                        }
+                      ]
+                    }
+                  ]
+                },
+                {
+                  "id": "vFW_1",
+                  "type": "<vnfc/tocsa.nodes.nfv.Vdu.Compute>",
+                  "directives": [
+                    {
+                      "type": "flavor_directives",
+                      "attributes": [
+                        {
+                          "attribute_name": "oof_returned_flavor_label_for_generator",
+                          "attribute_value": "vim_flavor_Y"
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ]
               },
               "cloud_owner": "CloudOwner1",
               "physical-location-id": "DLLSTX1A",
index 92751ac..71963e2 100644 (file)
   "solutions": {
     "placementSolutions": [
       [
-      {
-        "resourceModuleName": "vGMuxInfra",
-        "serviceResourceId": "someResourceId",
-        "solution": {
+        {
+          "resourceModuleName": "vGMuxInfra",
+          "serviceResourceId": "someResourceId",
+          "solution": {
             "identifierType": "serviceInstanceId",
-            "identifiers": ["gjhd-098-fhd-987"]
+            "identifiers": [
+              "gjhd-098-fhd-987"
+            ]
+          },
+          "assignmentInfo": [
+            {
+              "key": "cloudOwner",
+              "value": "amazon"
+            },
+            {
+              "key": "vnfHostName",
+              "value": "ahr344gh"
+            },
+            {
+              "key": "isRehome",
+              "value": "False"
+            },
+            {
+              "key": "cloudRegionId",
+              "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d"
+            },
+            {
+              "key": "oof_directives",
+              "value": {
+                "directives": [
+                  {
+                    "id": "vgmux_1",
+                    "type": "vnfc",
+                    "directives": [
+                      {
+                        "type": "flavor_directives",
+                        "attributes": [
+                          {
+                            "attribute_name": "flavorLabel1",
+                            "attribute_value": "vimFlavorX"
+                          }
+                        ]
+                      }
+                    ]
+                  },
+                  {
+                    "id": "vgmux_2",
+                    "type": "vnfc",
+                    "directives": [
+                      {
+                        "type": "flavor_directives",
+                        "attributes": [
+                          {
+                            "attribute_name": "flavorLabel2",
+                            "attribute_value": "vimFlavorY"
+                          }
+                        ]
+                      }
+                    ]
+                  }
+                ]
+              }
+            }
+          ]
         },
-        "assignmentInfo": [
-          { "key": "cloudOwner", "value": "amazon" },
-          { "key": "vnfHostName", "value": "ahr344gh" },
-          { "key": "isRehome", "value": "False" },
-          { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" },
-          { "key":"flavors", "value": { "flavorLabel1": "vimFlavorX", "flavorLabel2": "vimFlavorY"}}
-        ]
-      },
-      {
-        "resourceModuleName": "vG",
-        "serviceResourceId": "someResourceId",
-        "solution": {
+        {
+          "resourceModuleName": "vG",
+          "serviceResourceId": "someResourceId",
+          "solution": {
             "identifierType": "cloudRegionId",
             "cloudOwner": "amazon",
-            "identifiers": ["gjhd-098-fhd-987"]
-        },
-        "assignmentInfo": [
-          { "key": "cloudOwner", "value": "amazon" },
-          { "key": "cloudRegionId", "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d" }
-        ]
-      }
+            "identifiers": [
+              "gjhd-098-fhd-987"
+            ]
+          },
+          "assignmentInfo": [
+            {
+              "key": "cloudOwner",
+              "value": "amazon"
+            },
+            {
+              "key": "cloudRegionId",
+              "value": "1ac71fb8-ad43-4e16-9459-c3f372b8236d"
+            }
+          ]
+        }
       ]
     ],
     "licenseSolutions": [
       {
         "resourceModuleName": "vGMuxInfra",
         "serviceResourceId": "someResourceId",
-        "entitlementPoolUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
-        "licenseKeyGroupUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
-        "entitlementPoolInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"],
-        "licenseKeyGroupInvariantUUID": ["1ac71fb8-ad43-4e16-9459-c3f372b8236d", "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"]
+        "entitlementPoolUUID": [
+          "1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+          "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"
+        ],
+        "licenseKeyGroupUUID": [
+          "1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+          "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"
+        ],
+        "entitlementPoolInvariantUUID": [
+          "1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+          "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"
+        ],
+        "licenseKeyGroupInvariantUUID": [
+          "1ac71fb8-ad43-4e16-9459-c3f372b8236d",
+          "834fc71fb8-ad43-4fh7-9459-c3f372b8236f"
+        ]
       }
     ]
   }
index da4ef03..ce0b7e3 100644 (file)
       "policyType": "hpaPolicy",
       "flavorFeatures": [
         {
-          "flavorLabel": "flavor_label_vm_01",
+          "id": "vgmux_1",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_01",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuTopology",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "2","operator": ">=", "unit": ""},
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "4","operator": "<=", "unit": ""},
@@ -34,6 +47,7 @@
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
@@ -44,6 +58,7 @@
               "mandatory" : "False",
               "score" : "3",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key":"dataProcessingAccelerationLibrary", "hpa-attribute-value":"ovsDpdk_version", "operator": "=", "unit":""}
               ]
@@ -52,6 +67,7 @@
               "hpa-feature" : "cpuInstructionSetExtensions",
               "mandatory" : "True",
               "architecture": "INTEL-64",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"instructionSetExtensions", "hpa-attribute-value":["<CPUINST>", "<CPUINST>"], "operator": "ALL", "unit":""}
               ]
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_02",
+          "id": "vgmux_2",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_02",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuPinningy",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"logicalCpuThreadPinningPolicy", "hpa-attribute-value":"<CPUTHREADPOLICY>", "operator": "=", "unit":""},
                 {"hpa-attribute-key":"logicalCpuPinningPolicy", "hpa-attribute-value": "<CPUPOLICY>","operator": "=", "unit":""}
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "diskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
                 {"hpa-attribute-key": "ephemeralDiskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
               "hpa-feature" : "pcie",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "pciCount", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "pciVendorId", "hpa-attribute-value":"8086", "operator": "=", "unit": ""},
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_03",
+          "id": "vgmux_3",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_03",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "numa",
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numaNodes", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "numaCpu-0", "hpa-attribute-value":"2", "operator": "=", "unit": ""},
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "7",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key": "memoryPageSize", "hpa-attribute-value": "<MEMORYPAGESIZE>", "operator": "=", "unit": ""}
               ]
index f50ed6d..4dfb6ce 100644 (file)
       "policyType": "hpaPolicy",
       "flavorFeatures": [
         {
-          "flavorLabel": "flavor_label_vm_01",
+          "id": "vg_1",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_01",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuTopology",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "2","operator": ">=", "unit": ""},
                 {"hpa-attribute-key":"numCpuSockets", "hpa-attribute-value": "4","operator": "<=", "unit": ""},
@@ -34,6 +47,7 @@
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
@@ -44,6 +58,7 @@
               "mandatory" : "False",
               "score" : "3",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key":"dataProcessingAccelerationLibrary", "hpa-attribute-value":"ovsDpdk_version", "operator": "=", "unit":""}
               ]
@@ -52,6 +67,7 @@
               "hpa-feature" : "cpuInstructionSetExtensions",
               "mandatory" : "True",
               "architecture": "INTEL-64",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"instructionSetExtensions", "hpa-attribute-value":["<CPUINST>", "<CPUINST>"], "operator": "ALL", "unit":""}
               ]
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_02",
+          "id": "vg_2",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_02",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "cpuPinningy",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key":"logicalCpuThreadPinningPolicy", "hpa-attribute-value":"<CPUTHREADPOLICY>", "operator": "=", "unit":""},
                 {"hpa-attribute-key":"logicalCpuPinningPolicy", "hpa-attribute-value": "<CPUPOLICY>","operator": "=", "unit":""}
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "diskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
                 {"hpa-attribute-key": "ephemeralDiskSize", "hpa-attribute-value": "2", "operator": "=", "unit": "GB"},
               "hpa-feature" : "pcie",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "pciCount", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "pciVendorId", "hpa-attribute-value":"8086", "operator": "=", "unit": ""},
           ]
         },
         {
-          "flavorLabel": "flavor_label_vm_03",
+          "id": "vg_3",
+          "type": "vnfc",
+          "directives": [
+            {
+              "type": "flavor_directives",
+              "attributes": [
+                {
+                  "attribute_name": "flavor_label_vm_03",
+                  "attribute_value": ""
+                }
+              ]
+            }
+          ],
           "flavorProperties":[
             {
               "hpa-feature" : "numa",
               "mandatory" : "False",
               "score" : "5",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numaNodes", "hpa-attribute-value": "2", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "numaCpu-0", "hpa-attribute-value":"2", "operator": "=", "unit": ""},
               "hpa-feature" : "basicCapabilities",
               "mandatory" : "True",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                 {"hpa-attribute-key": "numVirtualCpu", "hpa-attribute-value": "6", "operator": "=", "unit": ""},
                 {"hpa-attribute-key": "virtualMemSize", "hpa-attribute-value":"6", "operator": "=", "unit": "GB"}
               "mandatory" : "False",
               "score" : "7",
               "architecture": "generic",
+              "directives": [],
               "hpa-feature-attributes": [
                  {"hpa-attribute-key": "memoryPageSize", "hpa-attribute-value": "<MEMORYPAGESIZE>", "operator": "=", "unit": ""}
               ]