7 #include <boost/algorithm/string.hpp>
8 #include <boost/bind/bind.hpp>
9 #include <boost/format.hpp>
17 #include "ifmap/ifmap_agent_types.h"
20 using namespace boost::placeholders;
26 :
IFMapTable(db, name, graph), pre_filter_(NULL) {
30 unique_ptr<DBEntry> entry(
43 unique_ptr<DBEntry> entry(
new IFMapNode(table));
51 string name = node_name;
52 std::replace(
name.begin(),
name.end(),
'-',
'_');
86 static_cast<const IFMapNode *
>(key.release()));
104 assert(ltable != NULL);
111 edge = iter.operator->();
116 assert(origin_exists);
119 req_key->left_key.id_name = node->
name();
121 req_key->left_key.id_seq_num = seq;
123 req_key->right_key.id_name = right->
name();
125 req_key->right_key.id_seq_num = seq;
130 req.
key = std::move(req_key);
135 ltable->
DelLink(node, right, edge);
168 std::list<DeferredNode>::iterator it;
170 std::list<DeferredNode> *left = NULL;
173 left = left_it->second;
175 std::list<DeferredNode> *right = NULL;
178 right = right_it->second;
184 for(it = left->begin(); it != left->end(); it++) {
196 for(it = right->begin(); it != right->end(); it++) {
209 bool push_left =
true;
214 for(it = left->begin(); it != left->end(); it++) {
218 (*it).link_metadata = key->
metadata;
224 left =
new std::list<DeferredNode>();
228 bool push_right =
true;
232 for(it = right->begin(); it != right->end(); it++) {
236 (*it).link_metadata = key->
metadata;
242 right =
new std::list<DeferredNode>();
255 right->push_back(dn);
270 "Table " + key->
id_type +
" not found");
277 if (table->
pre_filter_(table, node, request) ==
false) {
279 "Node " + key->
id_name +
" neglected as filter"
286 "Node " + key->
id_name +
"ID_PERMS Null");
293 "Node " + key->
id_name +
" not found in Delete");
299 "Node " + key->
id_name +
" already deleted");
344 node != NULL; node = next) {
346 if (node->IsDeleted()) {
357 const std::string &metadata) {
361 assert(table != NULL);
363 return (link ? (link->
IsDeleted() ? NULL : link) : NULL);
367 const std::string &metadata,
372 assert(table != NULL);
382 assert(table != NULL);
436 "list as left is deleted marked");
446 "list as right is deleted marked");
454 "IFMap Link " + left->
name() + right->
name() +
455 " with wrong seq number");
463 "IFMap Link " + left->
name() + right->
name() +
464 " with wrong seq number");
488 (
LinkDefMap *map, LinkDefMap::iterator &map_it,
489 std::list<DeferredNode>::iterator *list_it) {
491 std::list<DeferredNode> *list = map_it->second;
493 list->erase(*list_it);
511 LinkDefMap::iterator link_defmap_it =
link_def_map_.find(*key);
515 std::list<DeferredNode> *left_list = link_defmap_it->second;
516 std::list<DeferredNode>::iterator left_it, left_list_entry;
517 for(left_it = left_list->begin(); left_it != left_list->end();) {
518 left_list_entry = left_it++;
521 if ((*left_list_entry).node_key.id_seq_num < key->
id_seq_num)
526 &((*left_list_entry).node_key));
538 LinkDefMap::iterator right_defmap_it =
542 std::list<DeferredNode> *right_list = right_defmap_it->second;
543 std::list<DeferredNode>::iterator right_it, right_list_entry;
544 bool removed_something =
false;
545 for(right_it = right_list->begin(); right_it !=
546 right_list->end(); right_it++) {
549 if ((*right_it).node_key.id_seq_num < key->
id_seq_num)
552 if ((*right_it).node_key.id_type == key->
id_type &&
553 (*right_it).node_key.id_name == key->
id_name) {
555 removed_something =
true;
561 assert(removed_something);
564 unique_ptr <RequestKey> req_key (
new RequestKey);
565 req_key->left_key = *key;
566 req_key->right_key = (*left_list_entry).node_key;
567 req_key->metadata = (*left_list_entry).link_metadata;
569 left_list->erase(left_list_entry);
572 req.
key = std::move(req_key);
582 std::list<DeferredNode> *ent;
583 std::list<DeferredNode>::iterator it, list_entry;
584 IFMapAgentLinkTable::LinkDefMap::iterator dlist_it, temp;
589 for(it = ent->begin(); it != ent->end();) {
593 if ((*list_entry).node_key.id_seq_num < seq) {
595 &list_entry) ==
true) {
616 "IFMap Config Audit start:");
657 "Deleting node " + node->
name());
670 return "IFMapAgentStaleCleaner::IFMapAgentStaleCleanerWorker";
683 db_(db), graph_(graph) {
const DBGraph * graph() const
DBGraphVertex * target() const
edge_iterator edge_list_begin(DBGraph *graph)
bool HasAdjacencies(DBGraph *graph) const
edge_iterator edge_list_end(DBGraph *graph)
edge_iterator edge_list_begin()
boost::tuple< DBGraphVertex *, DBGraphVertex *, DBGraphEdge * > DBEdgeInfo
vertex_iterator vertex_list_begin()
Edge Link(DBGraphVertex *lhs, DBGraphVertex *rhs, DBGraphEdge *link)
edge_iterator edge_list_end()
void RemoveNode(DBGraphVertex *entry)
vertex_iterator vertex_list_end()
void AddNode(DBGraphVertex *entry)
bool Enqueue(DBRequest *req)
bool HasListeners() const
const std::string & name() const
void Notify(DBEntryBase *entry)
void Delete(DBEntryBase *)
virtual void Change(DBEntry *entry)
virtual void Add(DBEntry *entry)
virtual DBEntry * GetNext(const DBEntryBase *entry)
virtual DBEntry * GetFirst()
DBEntry * Find(const DBEntry *entry)
virtual DBTablePartBase * GetTablePartition(const DBRequestKey *key)
static void RegisterFactory(const std::string &prefix, CreateFunction create_fn)
DBTableBase * FindTable(const std::string &name)
DBTableBase * CreateTable(const std::string &name)
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
std::map< IFMapTable::RequestKey, std::list< DeferredNode > *, comp > LinkDefMap
static DBTable * CreateTable(DB *db, const std::string &name, DBGraph *graph)
IFMapLink * FindLink(IFMapNode *left, IFMapNode *right, const std::string &metadata)
void DestroyDefLink(uint64_t)
bool RemoveDefListEntry(LinkDefMap *map, LinkDefMap::iterator &map_it, std::list< DeferredNode >::iterator *list_it)
void DelLink(IFMapNode *first, IFMapNode *second, DBGraphEdge *edge)
IFMapAgentLinkTable(DB *db, const std::string &name, DBGraph *graph)
void AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t seq)
void LinkDefAdd(DBRequest *request)
void EvalDefLink(IFMapTable::RequestKey *key)
IFMapAgentStaleCleanerWorker(DB *db, DBGraph *graph, uint64_t seq)
bool Run()
Code to execute in a task. Returns true if task is completed. Return false to reschedule the task.
std::string Description() const
Gives a description of the task.
~IFMapAgentStaleCleaner()
bool StaleTimeout(uint64_t)
IFMapAgentStaleCleaner(DB *db, DBGraph *graph)
IFMapNode * EntryLocate(IFMapNode *node, RequestKey *key)
IFMapNode * EntryLookup(RequestKey *key)
IFMapAgentTable * TableFind(const std::string &node_name)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
void NotifyNode(IFMapNode *node)
static IFMapNode * TableEntryLookup(DB *db, RequestKey *key)
void DeleteNode(IFMapNode *node)
virtual void Input(DBTablePartition *partition, DBClient *client, DBRequest *req)
IFMapAgentTable(DB *db, const std::string &name, DBGraph *graph)
void HandlePendingLinks(IFMapNode *)
IFMapLink * FindLink(const std::string &metadata, IFMapNode *left, IFMapNode *right)
IFMapLink * AddLink(IFMapNode *left, IFMapNode *right, const std::string &metadata, uint64_t sequence_number, const IFMapOrigin &origin)
void DeleteLink(IFMapLink *link, const IFMapOrigin &origin)
void UpdateProperties(const IFMapOrigin &in_origin, uint64_t sequence_number)
const std::string & metadata() const
IFMapLink::LinkOriginInfo GetOriginInfo(IFMapOrigin::Origin in_origin, bool *exists)
uint64_t sequence_number(IFMapOrigin::Origin in_origin, bool *exists)
void Remove(IFMapObject *obj)
const std::string & name() const
IFMapObject * GetObject()
void Insert(IFMapObject *obj)
uint64_t sequence_number()
void set_sequence_number(uint64_t sequence_number)
static IFMapTable * FindTable(DB *db, const std::string &element_type)
virtual const char * Typename() const =0
static void ClearTables(DB *db)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
void Enqueue(Task *task)
Enqueues a task for running. Starts task if all policy rules are met else puts task in waitq....
static TaskScheduler * GetInstance()
Task is a class to describe a computational task within OpenSDN control plane applications....
void IFMapAgentLinkTable_Init(DB *db, DBGraph *graph)
SandeshTraceBufferPtr IFMapAgentTraceBuf(SandeshTraceBufferCreate("IFMapAgentTrace", 1000))
#define IFMAP_AGENT_TRACE(obj,...)
#define IFMAP_AGENT_LINK_DB_NAME
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
std::unique_ptr< DBRequestKey > key
std::unique_ptr< DBRequestData > data
std::string link_metadata
IFMapTable::RequestKey node_key
IFMapTable::RequestKey left_key
IFMapTable::RequestKey right_key
std::unique_ptr< IFMapObject > content