take-1 for the NST selection function 30/103130/1
authorseshukm <seshu.kumar.m@huawei.com>
Thu, 5 Mar 2020 13:26:32 +0000 (18:56 +0530)
committerseshukm <seshu.kumar.m@huawei.com>
Thu, 5 Mar 2020 13:26:32 +0000 (18:56 +0530)
Issue-ID: OPTFRA-675

Signed-off-by: seshukm <seshu.kumar.m@huawei.com>
Change-Id: Id48f33344c516f2711e24bce9f07adbd835eded0

apps/nst/__init__.py [new file with mode: 0644]
apps/nst/models/api/nstSelectionRequest.py [new file with mode: 0644]
apps/nst/optimizers/__init__.py [new file with mode: 0644]
apps/nst/optimizers/conf/configIinputs.json [new file with mode: 0644]
apps/nst/optimizers/nst_select_processor.py [new file with mode: 0644]
osdfapp.py

diff --git a/apps/nst/__init__.py b/apps/nst/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/nst/models/api/nstSelectionRequest.py b/apps/nst/models/api/nstSelectionRequest.py
new file mode 100644 (file)
index 0000000..dcc385e
--- /dev/null
@@ -0,0 +1,48 @@
+# -------------------------------------------------------------------------
+#   Copyright (c) 2020 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.
+#
+# -------------------------------------------------------------------------
+#
+
+from schematics.types import BaseType, StringType, URLType, IntType
+from schematics.types.compound import ModelType, ListType, DictType
+
+from osdf.models.api.common import OSDFModel
+from osdf.logging.osdf_logging import MH, audit_log
+
+class RequestInfo(OSDFModel):
+    """Info for northbound request from client such as SO"""
+    transactionId = StringType(required=True)
+    requestId = StringType(required=True)
+    callbackUrl = URLType(required=True)
+    callbackHeader = DictType(BaseType)
+    sourceId = StringType(required=True)
+    timeout = IntType()
+
+
+class ServiceProfile(OSDFModel):
+    """Information specific to   ServiceProfile """
+   # resourceName = StringType(required=True)
+   # resourceId = StringType(required=True)
+    serviceProfileParameters = DictType(BaseType)
+
+
+
+
+class NSTSelectionAPI(OSDFModel):
+    """Request for NST selection """
+    requestInfo = ModelType(RequestInfo, required=True)
+    serviceProfile = ModelType(ServiceProfile, required=True)
+
diff --git a/apps/nst/optimizers/__init__.py b/apps/nst/optimizers/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/apps/nst/optimizers/conf/configIinputs.json b/apps/nst/optimizers/conf/configIinputs.json
new file mode 100644 (file)
index 0000000..59fd5ed
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "NST": [{
+                       "NST1 ": {
+                               "name": "NST_1",
+                               "id": "NST_1_id",
+                               "latency": 5,
+                               "uplink": 5,
+                               "downlink": 8
+                       }
+               },
+               {
+                       "NST2 ": {
+                               "name": "NST_2",
+                               "id": "NST_2_id",
+                               "latency": 3,
+                               "uplink": 7,
+                               "downlink": 1
+                       }
+               }
+       ]
+}
\ No newline at end of file
diff --git a/apps/nst/optimizers/nst_select_processor.py b/apps/nst/optimizers/nst_select_processor.py
new file mode 100644 (file)
index 0000000..c340a90
--- /dev/null
@@ -0,0 +1,79 @@
+# -------------------------------------------------------------------------
+#   Copyright (c) 2020 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.
+#
+# -------------------------------------------------------------------------
+
+
+import json
+from osdf.logging.osdf_logging import MH, audit_log
+"""
+This application generates NST SELECTION API calls using the information received from SO
+"""
+
+def buildSolution(request_json):
+    return {
+        "NSTsolution" : getNSTSolution(request_json)
+    }
+
+def getNSTSolution(request_json):
+# the file is in the same folder for now will move it to the conf folder o fthe has once its integrated there...
+    with open('./conf/configIinputs.json', 'r') as openfile:
+        serviceProfile = request_json["serviceProfile"]
+        resourceName = "NST"
+        serviceProfileParameters = serviceProfile["serviceProfileParameters"]
+        nst_object = json.load(openfile)
+        foundNst = False
+        for nst in nst_object[resourceName]:
+            [(nstName, nstList)] = nst.items()
+            matchall = False
+            for constraint_name in serviceProfileParameters:
+                value = serviceProfileParameters[constraint_name]
+                constraint_value= nstList[constraint_name]
+                if constraint_value != value:
+                    matchall = False
+                    break
+                else:
+                    matchall = True
+            if matchall:
+                foundNst = True
+                NSTName = nstList["name"]
+                matchlevel = 1
+    if not(foundNst):
+        NSTName = None
+        matchlevel = 0
+    return {
+        "invariantUUID" : "INvariant UUID",
+        "UUID" : "uuid",
+        "NSTName" : NSTName,
+        "matchLevel" : matchlevel
+    }
+
+
+def process_nst_selection( request_json, osdf_config):
+    """
+    Process a PCI request from a Client (build config-db, policy and  API call, make the call, return result)
+    :param req_object: Request parameters from the client
+    :param osdf_config: Configuration specific to OSDF application (core + deployment)
+    :return: response from NST Opt
+    """
+    solution = buildSolution(request_json)
+
+    return {
+        "requestId" : request_json['requestInfo']['requestId'],
+        "transactionId" : request_json['requestInfo']['transactionId'],
+        "statusMessage" : " ",
+        "requestStatus" : "accepted",
+        "solutions" : solution
+    }
\ No newline at end of file
index 71106fd..bd9f081 100755 (executable)
@@ -26,7 +26,9 @@ from threading import Thread  # for scaling up, may need celery with RabbitMQ or
 from flask import request, g
 
 from osdf.apps.baseapp import app, run_app
+from apps.nst.models.api.nstSelectionRequest import NSTSelectionAPI
 from apps.pci.models.api.pciOptimizationRequest import PCIOptimizationAPI
+from apps.nst.optimizers.nst_select_processor import process_nst_selection
 from apps.pci.optimizers.pci_opt_processor import process_pci_optimation
 from apps.placement.models.api.placementRequest import PlacementAPI
 from apps.placement.optimizers.conductor.remote_opt_processor import process_placement_opt
@@ -98,6 +100,13 @@ def do_route_calc():
     audit_log.info("Calculate Route request received!")
     return RouteOpt().getRoute(request_json)
 
+@app.route("/api/oof/v1/selection/nst", methods=["POST"])
+def do_nst_selection():
+    request_json = request.get_json()
+    req_id = request_json['requestInfo']['requestId']
+    NSTSelectionAPI(request_json).validate()
+    response = process_nst_selection(request_json, osdf_config)
+    return response
 
 @app.route("/api/oof/v1/pci", methods=["POST"])
 @app.route("/api/oof/pci/v1", methods=["POST"])