6 #include <vnc_cfg_types.h>
7 #include <agent_types.h>
35 #include <boost/assign/list_of.hpp>
36 #include <boost/bind.hpp>
49 using namespace boost::assign;
68 : database_(database),
87 static const char *ifmap_types[] = {
88 "access-control-list",
92 "application-policy-set",
93 "application-policy-set-firewall-policy",
95 "bgpaas-control-node-zone",
104 "global-system-config",
109 "physical-interface",
117 "security-logging-object",
119 "service-health-check",
127 "virtual-machine-interface",
128 "virtual-machine-interface-routing-instance",
130 "virtual-network-network-ipam",
131 "virtual-port-group",
132 "virtual-port-group-physical-interface",
134 "global-vrouter-config",
136 "interface-route-table",
138 "virtual-machine-interface-bridge-domain",
139 "firewall-policy-firewall-rule",
147 assert(link_table != NULL);
154 const int n_types =
sizeof(ifmap_types) /
sizeof(
const char *);
155 for (
int i = 0; i < n_types; i++) {
156 const char *id_typename = ifmap_types[i];
167 ReactionMap react_si = map_list_of<string, PropagateList>
168 (
"service-instance-service-template", list_of(
"self")
170 (
"virtual-machine-service-instance", list_of(
"self")
172 (
"self", list_of(
"self").convert_to_container<
PropagateList>());
173 policy->insert(make_pair(
"service-instance", react_si));
175 ReactionMap react_tmpl = map_list_of<string, PropagateList>
176 (
"self", list_of(
"service-instance-service-template"));
177 policy->insert(make_pair(
"service-template", react_tmpl));
179 ReactionMap react_vm = map_list_of<string, PropagateList>
180 (
"self", list_of(
"virtual-machine-service-instance")
182 (
"virtual-machine-virtual-machine-interface",
183 list_of(
"virtual-machine-service-instance")
185 (
"virtual-machine-interface-virtual-machine",
186 list_of(
"virtual-machine-service-instance")
188 policy->insert(make_pair(
"virtual-machine", react_vm));
190 ReactionMap react_vmi = map_list_of<string, PropagateList>
191 (
"self", list_of(
"virtual-machine-interface-virtual-machine")
192 (
"logical-interface-virtual-machine-interface")
193 .convert_to_container<PropagateList>())
194 (
"instance-ip-virtual-machine-interface",
195 list_of(
"virtual-machine-interface-virtual-machine")
197 (
"virtual-machine-interface-virtual-network",
198 list_of(
"virtual-machine-interface-virtual-machine")
199 (
"logical-interface-virtual-machine-interface")
200 .convert_to_container<PropagateList>());
201 policy->insert(make_pair(
"virtual-machine-interface", react_vmi));
203 ReactionMap react_ip = map_list_of<string, PropagateList>
204 (
"self", list_of(
"instance-ip-virtual-machine-interface"));
205 policy->insert(make_pair(
"instance-ip", react_ip));
207 ReactionMap react_subnet = map_list_of<string, PropagateList>
208 (
"self", list_of(
"virtual-network-network-ipam")
210 (
"virtual-network-network-ipam", list_of(
"nil")
212 policy->insert(make_pair(
"virtual-network-network-ipam", react_subnet));
214 ReactionMap react_ipam = map_list_of<string, PropagateList>
215 (
"virtual-network-network-ipam", list_of(
"nil"));
216 policy->insert(make_pair(
"network-ipam", react_ipam));
218 ReactionMap react_bgpaas = map_list_of<string, PropagateList>
219 (
"bgpaas-control-node-zone",
220 list_of(
"bgpaas-virtual-machine-interface"));
221 policy->insert(make_pair(
"bgp-as-a-service", react_bgpaas));
233 table_map_.insert(make_pair(table->
name(), id));
236 tracker_->policy_map()->insert(make_pair(node_name, react));
240 for (TableMap::iterator iter =
table_map_.begin();
263 if (state->
notify() ==
true) {
388 bool oper_db_request_enqueued) {
408 node->
SetState(table, loc->second, state);
432 event_map_.insert(std::make_pair(type, handler));
449 return (strcmp(node->
table()->
Typename(),
"routing-instance") != 0);
453 (
const char *link1,
const char *node1,
bool interest1,
454 const char *link2 = NULL,
const char *node2 = NULL,
bool interest2 =
false,
455 const char *link3 = NULL,
const char *node3 = NULL,
bool interest3 =
false,
456 const char *link4 = NULL,
const char *node4 = NULL,
bool interest4 =
false,
457 const char *link5 = NULL,
const char *node5 = NULL,
bool interest5 =
false,
458 const char *link6 = NULL,
const char *node6 = NULL,
bool interest6 =
false) {
459 if (link2) assert(node2);
460 if (link3) assert(node3);
461 if (link4) assert(node4);
462 if (link5) assert(node5);
463 if (link6) assert(node6);
481 const string &node) {
482 NodeEventPolicy::iterator it = policy->find(node);
483 if (it != policy->end()) {
486 ReactionMap react = map_list_of<string, PropagateList>
488 policy->insert(make_pair(node, react));
489 return policy->find(node);
493 const string &event) {
494 ReactionMap::iterator it = react->find(event);
495 if (it != react->end()) {
499 return react->find(event);
566 NodeEventPolicy::iterator node_it;
570 LOG(DEBUG,
"Updating dependency tacker rules for " << node);
571 react_it->second.insert(
"self");
572 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
573 react_it->first <<
" -> " <<
"self");
575 for (
size_t i = 0; i < path.size(); i++) {
577 if (path[i].vertex_interest_) {
579 react_it->second.insert(path[i].edge_);
580 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
581 react_it->first <<
" -> " << path[i].edge_);
584 if (i < (path.size() - 1)) {
586 react_it->second.insert(path[i].edge_);
587 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
588 react_it->first <<
" -> " << path[i].edge_);
591 react_it->second.insert(
"nil");
592 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
593 react_it->first <<
" -> " <<
"nil");
634 MakePath(
"virtual-network-routing-instance",
635 "routing-instance",
true));
637 MakePath(
"virtual-network-access-control-list",
638 "access-control-list",
true));
640 MakePath(
"virtual-network-network-ipam",
641 "virtual-network-network-ipam",
true,
642 "virtual-network-network-ipam",
643 "network-ipam",
false));
645 MakePath(
"virtual-network-qos-config",
646 "qos-config",
true));
648 MakePath(
"virtual-network-security-logging-object",
649 "security-logging-object",
true));
651 MakePath(
"logical-router-virtual-network",
652 "logical-router-virtual-network",
true,
653 "logical-router-virtual-network",
654 "logical-router",
true));
656 MakePath(
"virtual-network-multicast-policy",
657 "multicast-policy",
true));
665 MakePath(
"virtual-network-routing-instance",
666 "virtual-network",
true,
667 "virtual-network-provider-network",
668 "virtual-network",
true));
676 MakePath(
"security-group-access-control-list",
677 "access-control-list",
true));
684 MakePath(
"application-policy-set-tag",
685 "application-policy-set",
true,
686 "policy-management-application-policy-set",
687 "policy-management",
false));
704 MakePath(
"virtual-machine-interface-virtual-network",
705 "virtual-network",
true,
706 "virtual-network-network-ipam",
707 "virtual-network-network-ipam",
true));
709 MakePath(
"virtual-machine-interface-virtual-machine",
710 "virtual-machine",
true));
712 MakePath(
"virtual-machine-interface-sub-interface",
713 "virtual-machine-interface",
true));
716 MakePath(
"virtual-machine-interface-virtual-network",
717 "virtual-network",
true,
718 "virtual-network-provider-network",
719 "virtual-network",
true));
722 MakePath(
"virtual-machine-interface-routing-instance",
723 "virtual-machine-interface-routing-instance",
725 "virtual-machine-interface-routing-instance",
726 "routing-instance",
true));
729 MakePath(
"virtual-machine-interface-security-group",
730 "security-group",
true));
732 MakePath(
"alias-ip-virtual-machine-interface",
734 "alias-ip-pool-alias-ip",
735 "alias-ip-pool",
false,
736 "virtual-network-alias-ip-pool",
737 "virtual-network",
true));
739 MakePath(
"floating-ip-virtual-machine-interface",
741 "floating-ip-pool-floating-ip",
742 "floating-ip-pool",
false,
743 "virtual-network-floating-ip-pool",
744 "virtual-network",
true,
745 "virtual-network-provider-network",
746 "virtual-network",
true));
748 MakePath(
"floating-ip-virtual-machine-interface",
750 "floating-ip-pool-floating-ip",
751 "floating-ip-pool",
false,
752 "virtual-network-floating-ip-pool",
753 "virtual-network",
true,
754 "virtual-network-routing-instance",
755 "routing-instance",
true));
757 MakePath(
"floating-ip-virtual-machine-interface",
759 "instance-ip-floating-ip",
760 "instance-ip",
false,
761 "instance-ip-virtual-network",
762 "virtual-network",
true));
764 MakePath(
"instance-ip-virtual-machine-interface",
765 "instance-ip",
true));
767 MakePath(
"virtual-machine-interface-route-table",
768 "interface-route-table",
true));
770 MakePath(
"subnet-virtual-machine-interface",
773 MakePath(
"logical-interface-virtual-machine-interface",
774 "logical-interface",
false,
775 "physical-interface-logical-interface",
776 "physical-interface",
false,
777 "physical-router-physical-interface",
778 "physical-router",
true));
780 MakePath(
"virtual-port-group-virtual-machine-interface",
781 "virtual-port-group",
false,
782 "virtual-port-group-physical-interface",
783 "physical-interface",
false,
784 "physical-router-physical-interface",
785 "physical-router",
true));
787 MakePath(
"bgpaas-virtual-machine-interface",
788 "bgp-as-a-service",
true,
791 "instance-bgp-router",
792 "routing-instance",
true));
794 MakePath(
"bgpaas-virtual-machine-interface",
795 "bgp-as-a-service",
true,
796 "bgpaas-health-check",
797 "service-health-check",
true));
799 MakePath(
"virtual-machine-interface-qos-config",
800 "qos-config",
true));
802 MakePath(
"virtual-machine-interface-security-logging-object",
803 "security-logging-object",
true));
806 MakePath(
"virtual-machine-interface-bridge-domain",
807 "virtual-machine-interface-bridge-domain",
809 "virtual-machine-interface-bridge-domain",
810 "bridge-domain",
true,
811 "virtual-network-bridge-domain",
812 "virtual-network",
true));
823 MakePath(
"virtual-machine-interface-bridge-domain",
824 "virtual-machine-interface-bridge-domain",
826 "virtual-machine-interface-bridge-domain",
827 "bridge-domain",
true));
830 MakePath(
"virtual-machine-interface-tag",
832 "application-policy-set-tag",
833 "application-policy-set",
true,
834 "application-policy-set-firewall-policy",
835 "application-policy-set-firewall-policy",
true,
836 "application-policy-set-firewall-policy",
837 "firewall-policy",
true));
840 MakePath(
"virtual-machine-interface-virtual-network",
841 "virtual-network",
true,
842 "virtual-network-tag",
"tag",
true,
843 "application-policy-set-tag",
844 "application-policy-set",
true,
845 "application-policy-set-firewall-policy",
846 "application-policy-set-firewall-policy",
true,
847 "application-policy-set-firewall-policy",
848 "firewall-policy",
true));
852 MakePath(
"virtual-machine-interface-virtual-machine",
853 "virtual-machine",
true,
854 "virtual-machine-tag",
"tag",
true,
855 "application-policy-set-tag",
856 "application-policy-set",
true,
857 "application-policy-set-firewall-policy",
858 "application-policy-set-firewall-policy",
true,
859 "application-policy-set-firewall-policy",
860 "firewall-policy",
true));
863 MakePath(
"virtual-machine-interface-sub-interface",
864 "virtual-machine-interface",
true,
865 "virtual-machine-interface-virtual-machine",
866 "virtual-machine",
true,
867 "virtual-machine-tag",
"tag",
true,
868 "application-policy-set-tag",
869 "application-policy-set",
true,
870 "application-policy-set-firewall-policy",
871 "application-policy-set-firewall-policy",
true,
872 "application-policy-set-firewall-policy",
873 "firewall-policy",
true));
876 MakePath(
"project-virtual-machine-interface",
878 "project-tag",
"tag",
true,
879 "application-policy-set-tag",
880 "application-policy-set",
true,
881 "application-policy-set-firewall-policy",
882 "application-policy-set-firewall-policy",
true,
883 "application-policy-set-firewall-policy",
884 "firewall-policy",
true));
891 "port-tuple-interface",
892 "virtual-machine-interface",
true));
894 MakePath(
"logical-router-interface",
895 "logical-router",
true));
903 MakePath(
"physical-router-physical-interface",
904 "physical-router",
true));
909 MakePath(
"virtual-port-group-physical-interface",
910 "virtual-port-group-physical-interface",
true,
911 "virtual-port-group-physical-interface",
912 "virtual-port-group",
true));
922 MakePath(
"physical-interface-logical-interface",
923 "physical-interface",
true,
924 "physical-router-physical-interface",
925 "physical-router",
true));
927 MakePath(
"logical-interface-virtual-machine-interface",
928 "virtual-machine-interface",
true));
930 MakePath(
"physical-router-logical-interface",
931 "physical-router",
true));
939 MakePath(
"physical-router-physical-interface",
940 "physical-interface",
true));
948 MakePath(
"service-port-health-check",
949 "virtual-machine-interface",
true,
950 "virtual-machine-interface-virtual-network",
951 "virtual-network",
false,
952 "virtual-network-network-ipam",
953 "virtual-network-network-ipam",
true));
955 MakePath(
"service-port-health-check",
956 "virtual-machine-interface",
true,
957 "port-tuple-interface",
959 "port-tuple-interface",
960 "virtual-machine-interface",
true,
961 "virtual-machine-interface-virtual-network",
962 "virtual-network",
false,
963 "virtual-network-network-ipam",
964 "virtual-network-network-ipam",
true));
969 MakePath(
"global-qos-config-qos-config",
970 "global-qos-config",
false));
978 MakePath(
"forwarding-class-qos-queue",
988 MakePath(
"security-logging-object-network-policy",
989 "network-policy",
true));
991 MakePath(
"security-logging-object-security-group",
992 "security-group",
true));
994 MakePath(
"firewall-policy-security-logging-object",
995 "firewall-policy-security-logging-object",
true,
996 "firewall-policy-security-logging-object",
997 "firewall-policy",
false));
999 MakePath(
"firewall-rule-security-logging-object",
1000 "firewall-rule-security-logging-object",
true,
1001 "firewall-rule-security-logging-object",
1002 "firewall-rule",
false));
1010 MakePath(
"virtual-router-sub-cluster",
1011 "sub-cluster",
true,
1012 "bgp-router-sub-cluster",
1013 "bgp-router",
true));
1030 MakePath(
"virtual-network-bridge-domain",
1031 "virtual-network",
true,
1032 "virtual-network-routing-instance",
1033 "routing-instance",
true));
1035 MakePath(
"virtual-network-bridge-domain",
1036 "virtual-network",
true));
1042 MakePath(
"application-policy-set-firewall-policy",
1043 "application-policy-set-firewall-policy",
true,
1044 "application-policy-set-firewall-policy",
1045 "firewall-policy",
true));
1050 MakePath(
"firewall-policy-firewall-rule",
1051 "firewall-policy-firewall-rule",
true,
1052 "firewall-policy-firewall-rule",
1053 "firewall-rule",
true,
1054 "firewall-rule-service-group",
1055 "service-group",
true));
1057 MakePath(
"firewall-policy-firewall-rule",
1058 "firewall-policy-firewall-rule",
true,
1059 "firewall-policy-firewall-rule",
1060 "firewall-rule",
true,
1061 "firewall-rule-address-group",
1062 "address-group",
true,
1063 "address-group-tag",
"tag",
"true"));
1066 MakePath(
"firewall-policy-firewall-rule",
1067 "firewall-policy-firewall-rule",
true,
1068 "firewall-policy-firewall-rule",
1069 "firewall-rule",
true,
1070 "firewall-rule-tag",
1074 MakePath(
"firewall-policy-firewall-rule",
1075 "firewall-policy-firewall-rule",
true,
1076 "firewall-policy-firewall-rule",
1077 "firewall-rule",
true));
1083 void IFMapNodePolicyReq::HandleRequest()
const {
1085 IFMapNodePolicyResp *resp =
new IFMapNodePolicyResp();
1089 NodeEventPolicy::iterator it1 = policy_list->begin();
1090 std::vector<IFMapNodePolicy> resp_policy_list;
1091 while (it1 != policy_list->end()) {
1092 if (it1->first.find(get_node()) == string::npos) {
1097 ReactionMap::iterator it2 = it1->second.begin();
1098 vector<IFMapReactEvent> resp_event_list;
1099 while(it2 != it1->second.end()) {
1100 IFMapReactEvent resp_event;
1101 vector<string> resp_reactor_list;
1102 PropagateList::iterator it3 = it2->second.begin();
1103 while (it3 != it2->second.end()) {
1104 resp_reactor_list.push_back((*it3));
1107 resp_event.set_event(it2->first);
1108 resp_event.set_reactors(resp_reactor_list);
1109 resp_event_list.push_back(resp_event);
1113 IFMapNodePolicy policy;
1114 policy.set_node(it1->first);
1115 policy.set_events(resp_event_list);
1116 resp_policy_list.push_back(policy);
1120 resp->set_policies(resp_policy_list);
1121 resp->set_context(context());
1122 resp->set_more(
false);
int intrusive_ptr_add_ref(const AsPath *cpath)
bool IsRegistered(const IFMapNode *node)
void NodeObserver(DBTablePartBase *root, DBEntryBase *db_entry)
static Agent * GetInstance()
void Unregister(const std::string &type)
void PropogateNodeChange(IFMapNode *node)
const std::string & metadata() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void SetObject(IFMapNode *node, DBEntry *entry)
void LinkObserver(DBTablePartBase *root, DBEntryBase *db_entry)
IFMapDependencyManager::Path MakePath(const char *link1, const char *node1, bool interest1, const char *link2=NULL, const char *node2=NULL, bool interest2=false, const char *link3=NULL, const char *node3=NULL, bool interest3=false, const char *link4=NULL, const char *node4=NULL, bool interest4=false, const char *link5=NULL, const char *node5=NULL, bool interest5=false, const char *link6=NULL, const char *node6=NULL, bool interest6=false)
IFMapNodeState * IFMapNodeGet(IFMapNode *node)
PhysicalDeviceTable * physical_device_table() const
void Register(const std::string &type, ChangeEventHandler handler)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
IFMapNode * RightNode(DB *db)
GlobalQosConfig * global_qos_config() const
void InitializeDependencyRules(Agent *agent)
std::set< std::string > PropagateList
void IFMapNodeReset(IFMapNode *node)
virtual const char * Typename() const =0
std::map< std::string, ReactionMap > NodeEventPolicy
InterfaceTable * interface_table() const
void RegisterReactionMap(const char *node_name, const IFMapDependencyTracker::ReactionMap &react)
VnTable * vn_table() const
IFMapDependencyTracker::NodeEventPolicy NodeEventPolicy
static void RegisterConfigHandler(IFMapDependencyManager *dep, const char *name, OperIFMapTable *table)
void ChangeListAdd(IFMapNode *node)
TagTable * tag_table() const
void Unregister(ListenerId listener)
QosQueueTable * qos_queue_table() const
int GetTaskId(const std::string &name)
IFMapNode * LeftNode(DB *db)
IFMapDependencyManager * dependency_manager()
IFMapDependencyManager(DB *database, DBGraph *graph)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
BgpRouterConfig * bgp_router_config() const
void AddDependencyPath(const std::string &node, Path path)
std::unique_ptr< IFMapDependencyTracker > tracker_
GlobalVrouter * global_vrouter() const
NodeEventPolicy * policy_map()
void ConfigEventHandler(IFMapNode *node, DBEntry *entry)
VRouter * vrouter() const
PolicySetTable * policy_set_table() const
IFMapDependencyManager * manager_
OperNetworkIpam * network_ipam() const
static TaskScheduler * GetInstance()
BridgeDomainTable * bridge_domain_table() const
void set_object(DBEntry *object)
std::unique_ptr< TaskTrigger > trigger_
void SetRequestEnqueued(IFMapNode *node, bool oper_db_request_enqueued)
void set_notify(bool flag)
const std::string & name() const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
bool IsNodeIdentifiedByUuid(const IFMapNode *node)
IFMapNodePtr SetState(IFMapNode *node)
VrfTable * vrf_table() const
OperVirtualDns * virtual_dns() const
HealthCheckTable * health_check_table() const
static NodeEventPolicy::iterator LocateNodeEventPolicy(NodeEventPolicy *policy, const string &node)
AgentQosConfigTable * qos_config_table() const
boost::intrusive_ptr< IFMapNodeState > IFMapNodePtr
IFMapDependencyTracker::ReactionMap ReactionMap
SecurityLoggingObjectTable * slo_table() const
static IFMapTable * FindTable(DB *db, const std::string &element_type)
#define IFMAP_AGENT_LINK_DB_NAME
DBEntry * GetObject(IFMapNode *node)
#define LOG(_Level, _Msg)
SgTable * sg_table() const
edge_iterator edge_list_end(DBGraph *graph)
void intrusive_ptr_release(const AsPath *cpath)
void PropogateNodeAndLinkChange(IFMapNode *node)
void SetNotify(IFMapNode *node, bool notfiy_flag)
IFMapDependencyTracker::PropagateList PropagateList
void set_oper_db_request_enqueued(bool oper_db_request_enqueued)
std::map< std::string, PropagateList > ReactionMap
void Initialize(Agent *agent)
ForwardingClassTable * forwarding_class_table() const
MulticastPolicyTable * mp_table() const
virtual void ConfigEventHandler(IFMapNode *node, DBEntry *entry)
AclTable * acl_table() const
boost::function< void(IFMapNode *, DBEntry *)> ChangeEventHandler
GlobalSystemConfig * global_system_config() const
IFMapDependencyTracker * tracker() const
VmTable * vm_table() const
virtual ~IFMapDependencyManager()
DBTableBase * FindTable(const std::string &name)
edge_iterator edge_list_begin(DBGraph *graph)
static ReactionMap::iterator LocateReactionMap(ReactionMap *react, const string &event)