Bug fixed Arista SDN plugin
[osm/RO.git] / RO-SDN-arista / osm_rosdn_arista / aristaTask.py
diff --git a/RO-SDN-arista/osm_rosdn_arista/aristaTask.py b/RO-SDN-arista/osm_rosdn_arista/aristaTask.py
new file mode 100644 (file)
index 0000000..a338afd
--- /dev/null
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-\r
+##\r
+# Copyright 2019 Atos - CoE Telco NFV Team\r
+# All Rights Reserved.\r
+#\r
+# Contributors: Oscar Luis Peral, Atos\r
+#\r
+# Licensed under the Apache License, Version 2.0 (the "License"); you may\r
+# not use this file except in compliance with the License. You may obtain\r
+# a copy of the License at\r
+#\r
+#         http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\r
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\r
+# License for the specific language governing permissions and limitations\r
+# under the License.\r
+#\r
+# For those usages not covered by the Apache License, Version 2.0 please\r
+# contact with: <oscarluis.peral@atos.net>\r
+#\r
+# Neither the name of Atos nor the names of its\r
+# contributors may be used to endorse or promote products derived from\r
+# this software without specific prior written permission.\r
+#\r
+# This work has been performed in the context of Arista Telefonica OSM PoC.\r
+##\r
+import time\r
+\r
+\r
+class AristaCVPTask:\r
+    def __init__(self, cvpClientApi):\r
+        self.cvpClientApi = cvpClientApi\r
+\r
+    def __get_id(self, task):\r
+        return task.get("workOrderId")\r
+\r
+    def __get_state(self, task):\r
+        return task.get("workOrderUserDefinedStatus")\r
+\r
+    def __execute_task(self, task_id):\r
+        return self.cvpClientApi.execute_task(task_id)\r
+\r
+    def __cancel_task(self, task_id):\r
+        return self.cvpClientApi.cancel_task(task_id)\r
+\r
+    def __apply_state(self, task, state):\r
+        t_id = self.__get_id(task)\r
+        self.cvpClientApi.add_note_to_task(t_id, "Executed by OSM")\r
+        if state == "executed":\r
+            return self.__execute_task(t_id)\r
+        elif state == "cancelled":\r
+            return self.__cancel_task(t_id)\r
+\r
+    def __actionable(self, state):\r
+        return state in ["Pending"]\r
+\r
+    def __terminal(self, state):\r
+        return state in ["Completed", "Cancelled"]\r
+\r
+    def __state_is_different(self, task, target):\r
+        return self.__get_state(task) != target\r
+\r
+    def update_all_tasks(self, data):\r
+        new_data = dict()\r
+        for task_id in data.keys():\r
+            res = self.cvpClientApi.get_task_by_id(task_id)\r
+            new_data[task_id] = res\r
+        return new_data\r
+\r
+    def get_pending_tasks(self):\r
+        return self.cvpClientApi.get_tasks_by_status('Pending')\r
+\r
+    def get_pending_tasks_old(self):\r
+        taskList = []\r
+        tasksField = {'workOrderId': 'workOrderId',\r
+                      'workOrderState': 'workOrderState',\r
+                      'currentTaskName': 'currentTaskName',\r
+                      'description': 'description',\r
+                      'workOrderUserDefinedStatus':\r
+                      'workOrderUserDefinedStatus',\r
+                      'note': 'note',\r
+                      'taskStatus': 'taskStatus',\r
+                      'workOrderDetails': 'workOrderDetails'}\r
+        tasks = self.cvpClientApi.get_tasks_by_status('Pending')\r
+        # Reduce task data to required fields\r
+        for task in tasks:\r
+            taskFacts = {}\r
+            for field in task.keys():\r
+                if field in tasksField:\r
+                    taskFacts[tasksField[field]] = task[field]\r
+            taskList.append(taskFacts)\r
+        return taskList\r
+\r
+    def task_action(self, tasks, wait, state):\r
+        changed = False\r
+        data = dict()\r
+        warnings = list()\r
+\r
+        at = [t for t in tasks if self.__actionable(self.__get_state(t))]\r
+        actionable_tasks = at\r
+\r
+        if len(actionable_tasks) == 0:\r
+            warnings.append("No actionable tasks found on CVP")\r
+            return changed, data, warnings\r
+\r
+        for task in actionable_tasks:\r
+            if self.__state_is_different(task, state):\r
+                self.__apply_state(task, state)\r
+                changed = True\r
+                data[self.__get_id(task)] = task\r
+\r
+        if wait == 0:\r
+            return changed, data, warnings\r
+\r
+        start = time.time()\r
+        now = time.time()\r
+        while (now - start) < wait:\r
+            data = self.update_all_tasks(data)\r
+            if all([self.__terminal(self.__get_state(t)) for t in data.values()]):\r
+                break\r
+            time.sleep(1)\r
+            now = time.time()\r
+\r
+        if wait:\r
+            for i, task in data.items():\r
+                if not self.__terminal(self.__get_state(task)):\r
+                    warnings.append("Task {} has not completed in {} seconds".\r
+                                    format(i, wait))\r
+\r
+        return changed, data, warnings\r