X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Flcm_utils.py;h=01701a5aada32053fd8410230c7308643d9c96f3;hb=3e359b1f0c36fb97145b0bfcbd4d8cc89117924a;hp=cb741181991c095078b5b1df416f0c4f8ec912ab;hpb=f578e55acd56e8bb15bda3604f9192280988105c;p=osm%2FLCM.git diff --git a/osm_lcm/lcm_utils.py b/osm_lcm/lcm_utils.py index cb74118..01701a5 100644 --- a/osm_lcm/lcm_utils.py +++ b/osm_lcm/lcm_utils.py @@ -1,9 +1,23 @@ -#!/usr/bin/python3 # -*- coding: utf-8 -*- +## +# Copyright 2018 Telefonica S.A. +# +# 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 collections import OrderedDict -from osm_common.dbbase import DbException +# from osm_common.dbbase import DbException __author__ = "Alfonso Tierno" @@ -16,6 +30,10 @@ class LcmExceptionNoMgmtIP(LcmException): pass +class LcmExceptionExit(LcmException): + pass + + def versiontuple(v): """utility for compare dot separate versions. Fills with zeros to proper number comparison package version will be something like 4.0.1.post11+gb3f024d.dirty-1. Where 4.0.1 is the git tag, postXX is the @@ -40,14 +58,16 @@ class TaskRegistry: def __init__(self): self.task_registry = { "ns": {}, + "nsi": {}, "vim_account": {}, + "wim_account": {}, "sdn": {}, } def register(self, topic, _id, op_id, task_name, task): """ Register a new task - :param topic: Can be "ns", "vim_account", "sdn" + :param topic: Can be "ns", "nsi", "vim_account", "sdn" :param _id: _id of the related item :param op_id: id of the operation of the related item :param task_name: Task descriptive name, as create, instantiate, terminate. Must be unique in this op_id @@ -64,23 +84,27 @@ class TaskRegistry: def remove(self, topic, _id, op_id, task_name=None): """ - When task is ended, it should removed. It ignores missing tasks - :param topic: Can be "ns", "vim_account", "sdn" + When task is ended, it should be removed. It ignores missing tasks. It also removes tasks done with this _id + :param topic: Can be "ns", "nsi", "vim_account", "sdn" :param _id: _id of the related item :param op_id: id of the operation of the related item - :param task_name: Task descriptive name. If note it deletes all - :return: + :param task_name: Task descriptive name. If none it deletes all tasks with same _id and op_id + :return: None """ - if not self.task_registry[topic].get(_id) or not self.task_registry[topic][_id].get(op_id): + if not self.task_registry[topic].get(_id): return if not task_name: - # print("deleting tasks", topic, _id, op_id, self.task_registry[topic][_id][op_id]) - del self.task_registry[topic][_id][op_id] - elif task_name in self.task_registry[topic][_id][op_id]: - # print("deleting tasks", topic, _id, op_id, task_name, self.task_registry[topic][_id][op_id][task_name]) - del self.task_registry[topic][_id][op_id][task_name] - if not self.task_registry[topic][_id][op_id]: - del self.task_registry[topic][_id][op_id] + self.task_registry[topic][_id].pop(op_id, None) + elif self.task_registry[topic][_id].get(op_id): + self.task_registry[topic][_id][op_id].pop(task_name, None) + + # delete done tasks + for op_id_ in list(self.task_registry[topic][_id]): + for name, task in self.task_registry[topic][_id][op_id_].items(): + if not task.done(): + break + else: + del self.task_registry[topic][_id][op_id_] if not self.task_registry[topic][_id]: del self.task_registry[topic][_id] @@ -96,15 +120,16 @@ class TaskRegistry: continue for task_name, task in self.task_registry[topic][_id][op_id].items(): - task_list.append(task) - task_name_list.append(task_name) + if not task.done(): + task_list.append(task) + task_name_list.append(task_name) break return ", ".join(task_name_list), task_list def cancel(self, topic, _id, target_op_id=None, target_task_name=None): """ - Cancel all active tasks of a concrete ns, vim_account, sdn identified for _id. If op_id is supplied only this is - cancelled, and the same with task_name + Cancel all active tasks of a concrete ns, nsi, vim_account, sdn identified for _id. If op_id is supplied only + this is cancelled, and the same with task_name """ if not self.task_registry[topic].get(_id): return @@ -134,16 +159,15 @@ class LcmBase: def update_db_2(self, item, _id, _desc): """ - Updates database with _desc information. Upon success _desc is cleared + Updates database with _desc information. If success _desc is cleared :param item: :param _id: - :param _desc: - :return: + :param _desc: dictionary with the content to update. Keys are dot separated keys for + :return: None. Exception is raised on error """ if not _desc: return - try: - self.db.set_one(item, {"_id": _id}, _desc) - _desc.clear() - except DbException as e: - self.logger.error("Updating {} _id={} with '{}'. Error: {}".format(item, _id, _desc, e)) + self.db.set_one(item, {"_id": _id}, _desc) + _desc.clear() + # except DbException as e: + # self.logger.error("Updating {} _id={} with '{}'. Error: {}".format(item, _id, _desc, e))