7 #include <boost/assign/list_of.hpp>
8 #include <boost/bind.hpp>
17 using namespace boost::assign;
27 : metadata(meta), id_type(type), id_name(name) {
47 map_list_of<string, PropagateList>
48 (
"self", list_of(
"self").convert_to_container<
PropagateList>())
49 (
"virtual-network-network-ipam", list_of(
"self")
51 policy_.insert(make_pair(
"network-ipam", ipam_react));
54 map_list_of<string, PropagateList>
55 (
"self", list_of(
"self"))
56 (
"network-ipam", list_of(
"self"))
57 (
"virtual-network-network-ipam", list_of(
"self"));
58 policy_.insert(make_pair(
"virtual-network-network-ipam", vnni_react));
61 map_list_of<string, PropagateList>
62 (
"self", list_of(
"self"));
63 policy_.insert(make_pair(
"virtual-DNS", virt_dns_react));
65 map_list_of<string, PropagateList>
66 (
"self", list_of(
"self").convert_to_container<
PropagateList>())
67 (
"virtual-DNS-virtual-DNS-record", list_of(
"self")
69 policy_.insert(make_pair(
"virtual-DNS-record", virt_dns_rec_react));
73 ostringstream identifier;
75 vertex_list_.insert(identifier.str());
76 if (IsInterestingEvent(node,
"self")) {
84 bool interest =
false;
85 if ((left != NULL) && IsInterestingEvent(left, metadata)) {
91 if ((right != NULL) && IsInterestingEvent(right, metadata)) {
103 for (NodeList::iterator iter = node_list_.begin();
104 iter != node_list_.end(); ++iter) {
111 if ((node == NULL) || node->
IsDeleted()) {
114 PropagateNode(node, &in_edges, change_list);
117 for (EdgeDescriptorList::iterator iter = edge_list_.begin();
118 iter != edge_list_.end(); ++iter) {
126 if ((node == NULL) || node->
IsDeleted()) {
129 PropagateEdge(node, edge.
metadata, &in_edges, change_list);
134 vertex_list_.clear();
143 const string &metadata)
const {
144 NodeEventPolicy::const_iterator loc = policy_.find(type);
145 if (loc == policy_.end()) {
148 ReactionMap::const_iterator react = loc->second.find(metadata);
149 if (react == loc->second.end()) {
152 return &react->second;
156 const string &metadata)
const {
160 return GetPropagateList(node->
table()->
Typename(), metadata) != NULL;
176 PropagateEdge(target, link->
metadata(), in_edges, change_list);
188 in_edges->insert(make_pair(node, metadata));
190 PropagateList::const_iterator
self = plist->find(
"self");
191 if (
self != plist->end()) {
192 AddChangeEvent(change_list, node);
200 PropagateList::const_iterator p_edge =
202 if (p_edge == plist->end()) {
206 if (in_edges->count(make_pair(target, link->
metadata())) > 0) {
209 PropagateEdge(target, link->
metadata(), in_edges, change_list);
214 ostringstream identifier;
216 if (vertex_list_.count(identifier.str()) > 0) {
219 listener_->ChangeListAdd(change_list, node);
220 vertex_list_.insert(identifier.str());
238 const char *config_types[]) {
240 database->
FindTable(
"__ifmap_metadata__.0"));
241 assert(link_table != NULL);
246 for (
int i = 0; i < ntypes; i++) {
247 const char *type_name = config_types[i];
295 if (current == NULL) {
300 change_list->push_back(delta);
311 if (node->
GetState(table, tid->second) == NULL) {
boost::shared_ptr< IFMapNodeProxy > IFMapNodeProxyRef
map< string, ReactionMap > NodeEventPolicy
list< EdgeDescriptor > EdgeDescriptorList
ConfigListener * listener_
const std::string & metadata() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void LinkObserver(DBTablePartBase *root, DBEntryBase *db_entry)
void ChangeListAdd(ChangeList *change_list, IFMapNode *node) const
void PropagateEdge(IFMapNode *node, const string &metadata, InEdgeSet *in_edges, ChangeList *change_list)
void PropagateNode(IFMapNode *node, InEdgeSet *in_edges, ChangeList *change_list)
set< pair< IFMapNode *, string > > InEdgeSet
IFMapNode * RightNode(DB *db)
void Terminate(DB *database)
void Initialize(DB *database, int ntypes, const char *config_types[])
void AddChangeEvent(ChangeList *change_list, IFMapNode *node)
virtual const char * Typename() const =0
std::vector< ConfigDelta > ChangeList
boost::intrusive_ptr< IFMapObject > IFMapObjectRef
set< string > PropagateList
set< string > vertex_list_
void Unregister(ListenerId listener)
IFMapNode * LeftNode(DB *db)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
virtual ~ConfigListener()
void NodeObserver(DBTablePartBase *root, DBEntryBase *db_entry)
void NodeEvent(IFMapNode *node)
const PropagateList * GetPropagateList(const string &type, const string &metadata) const
void GetChangeList(ChangeList *change_list)
IFMapNode * FindNode(const std::string &name)
DnsConfigManager * manager_
const std::string & name() const
DependencyTracker(ConfigListener *listener)
const std::string & name() const
void PropagateChanges(ChangeList *change_list)
EdgeDescriptorList edge_list_
ConfigListener(DnsConfigManager *manager)
IFMapObject * GetObject()
static IFMapTable * FindTable(DB *db, const std::string &element_type)
bool IsInterestingEvent(const IFMapNode *node, const string &metadata) const
map< string, PropagateList > ReactionMap
edge_iterator edge_list_end(DBGraph *graph)
bool LinkEvent(const string metadata, IFMapNode *left, IFMapNode *right)
list< pair< string, string > > NodeList
EdgeDescriptor(const string &meta, const string &type, const string &name)
boost::scoped_ptr< DependencyTracker > tracker_
DBTableBase * FindTable(const std::string &name)
edge_iterator edge_list_begin(DBGraph *graph)