cb741181991c095078b5b1df416f0c4f8ec912ab
2 # -*- coding: utf-8 -*-
5 from collections
import OrderedDict
6 from osm_common
.dbbase
import DbException
8 __author__
= "Alfonso Tierno"
11 class LcmException(Exception):
15 class LcmExceptionNoMgmtIP(LcmException
):
20 """utility for compare dot separate versions. Fills with zeros to proper number comparison
21 package version will be something like 4.0.1.post11+gb3f024d.dirty-1. Where 4.0.1 is the git tag, postXX is the
22 number of commits from this tag, and +XXXXXXX is the git commit short id. Total length is 16 with until 999 commits
25 for point
in v
.split("."):
26 filled
.append(point
.zfill(16))
32 Implements a registry of task needed for later cancelation, look for related tasks that must be completed before
33 etc. It stores a four level dict
34 First level is the topic, ns, vim_account, sdn
35 Second level is the _id
36 Third level is the operation id
37 Fourth level is a descriptive name, the value is the task class
41 self
.task_registry
= {
47 def register(self
, topic
, _id
, op_id
, task_name
, task
):
50 :param topic: Can be "ns", "vim_account", "sdn"
51 :param _id: _id of the related item
52 :param op_id: id of the operation of the related item
53 :param task_name: Task descriptive name, as create, instantiate, terminate. Must be unique in this op_id
54 :param task: Task class
57 if _id
not in self
.task_registry
[topic
]:
58 self
.task_registry
[topic
][_id
] = OrderedDict()
59 if op_id
not in self
.task_registry
[topic
][_id
]:
60 self
.task_registry
[topic
][_id
][op_id
] = {task_name
: task
}
62 self
.task_registry
[topic
][_id
][op_id
][task_name
] = task
63 # print("registering task", topic, _id, op_id, task_name, task)
65 def remove(self
, topic
, _id
, op_id
, task_name
=None):
67 When task is ended, it should removed. It ignores missing tasks
68 :param topic: Can be "ns", "vim_account", "sdn"
69 :param _id: _id of the related item
70 :param op_id: id of the operation of the related item
71 :param task_name: Task descriptive name. If note it deletes all
74 if not self
.task_registry
[topic
].get(_id
) or not self
.task_registry
[topic
][_id
].get(op_id
):
77 # print("deleting tasks", topic, _id, op_id, self.task_registry[topic][_id][op_id])
78 del self
.task_registry
[topic
][_id
][op_id
]
79 elif task_name
in self
.task_registry
[topic
][_id
][op_id
]:
80 # print("deleting tasks", topic, _id, op_id, task_name, self.task_registry[topic][_id][op_id][task_name])
81 del self
.task_registry
[topic
][_id
][op_id
][task_name
]
82 if not self
.task_registry
[topic
][_id
][op_id
]:
83 del self
.task_registry
[topic
][_id
][op_id
]
84 if not self
.task_registry
[topic
][_id
]:
85 del self
.task_registry
[topic
][_id
]
87 def lookfor_related(self
, topic
, _id
, my_op_id
=None):
90 if _id
not in self
.task_registry
[topic
]:
91 return "", task_name_list
92 for op_id
in reversed(self
.task_registry
[topic
][_id
]):
95 my_op_id
= None # so that the next task is taken
98 for task_name
, task
in self
.task_registry
[topic
][_id
][op_id
].items():
99 task_list
.append(task
)
100 task_name_list
.append(task_name
)
102 return ", ".join(task_name_list
), task_list
104 def cancel(self
, topic
, _id
, target_op_id
=None, target_task_name
=None):
106 Cancel all active tasks of a concrete ns, vim_account, sdn identified for _id. If op_id is supplied only this is
107 cancelled, and the same with task_name
109 if not self
.task_registry
[topic
].get(_id
):
111 for op_id
in reversed(self
.task_registry
[topic
][_id
]):
112 if target_op_id
and target_op_id
!= op_id
:
114 for task_name
, task
in self
.task_registry
[topic
][_id
][op_id
].items():
115 if target_task_name
and target_task_name
!= task_name
:
120 # self.logger.debug("{} _id={} order_id={} task={} cancelled".format(topic, _id, op_id, task_name))
125 def __init__(self
, db
, msg
, fs
, logger
):
128 :param db: database connection
135 def update_db_2(self
, item
, _id
, _desc
):
137 Updates database with _desc information. Upon success _desc is cleared
146 self
.db
.set_one(item
, {"_id": _id
}, _desc
)
148 except DbException
as e
:
149 self
.logger
.error("Updating {} _id={} with '{}'. Error: {}".format(item
, _id
, _desc
, e
))