6 #include <vnc_cfg_types.h>
7 #include <agent_types.h>
35 #include <boost/assign/list_of.hpp>
36 #include <boost/bind/bind.hpp>
49 using namespace boost::assign;
51 using namespace boost::placeholders;
70 : database_(database),
89 static const char *ifmap_types[] = {
90 "access-control-list",
94 "application-policy-set",
95 "application-policy-set-firewall-policy",
97 "bgpaas-control-node-zone",
106 "global-system-config",
111 "physical-interface",
119 "security-logging-object",
121 "service-health-check",
129 "virtual-machine-interface",
130 "virtual-machine-interface-routing-instance",
132 "virtual-network-network-ipam",
133 "virtual-port-group",
134 "virtual-port-group-physical-interface",
136 "global-vrouter-config",
138 "interface-route-table",
140 "virtual-machine-interface-bridge-domain",
141 "firewall-policy-firewall-rule",
149 assert(link_table != NULL);
156 const int n_types =
sizeof(ifmap_types) /
sizeof(
const char *);
157 for (
int i = 0; i < n_types; i++) {
158 const char *id_typename = ifmap_types[i];
169 ReactionMap react_si = map_list_of<string, PropagateList>
170 (
"service-instance-service-template", list_of(
"self")
171 .convert_to_container<PropagateList>())
172 (
"virtual-machine-service-instance", list_of(
"self")
174 (
"self", list_of(
"self").convert_to_container<
PropagateList>());
175 policy->insert(make_pair(
"service-instance", react_si));
177 ReactionMap react_tmpl = map_list_of<string, PropagateList>
178 (
"self", list_of(
"service-instance-service-template"));
179 policy->insert(make_pair(
"service-template", react_tmpl));
181 ReactionMap react_vm = map_list_of<string, PropagateList>
182 (
"self", list_of(
"virtual-machine-service-instance")
183 .convert_to_container<PropagateList>())
184 (
"virtual-machine-virtual-machine-interface",
185 list_of(
"virtual-machine-service-instance")
187 (
"virtual-machine-interface-virtual-machine",
188 list_of(
"virtual-machine-service-instance")
190 policy->insert(make_pair(
"virtual-machine", react_vm));
192 ReactionMap react_vmi = map_list_of<string, PropagateList>
193 (
"self", list_of(
"virtual-machine-interface-virtual-machine")
194 (
"logical-interface-virtual-machine-interface")
195 .convert_to_container<PropagateList>())
196 (
"instance-ip-virtual-machine-interface",
197 list_of(
"virtual-machine-interface-virtual-machine")
199 (
"virtual-machine-interface-virtual-network",
200 list_of(
"virtual-machine-interface-virtual-machine")
201 (
"logical-interface-virtual-machine-interface")
202 .convert_to_container<PropagateList>());
203 policy->insert(make_pair(
"virtual-machine-interface", react_vmi));
205 ReactionMap react_ip = map_list_of<string, PropagateList>
206 (
"self", list_of(
"instance-ip-virtual-machine-interface"));
207 policy->insert(make_pair(
"instance-ip", react_ip));
209 ReactionMap react_subnet = map_list_of<string, PropagateList>
210 (
"self", list_of(
"virtual-network-network-ipam")
211 .convert_to_container<PropagateList>())
212 (
"virtual-network-network-ipam", list_of(
"nil")
214 policy->insert(make_pair(
"virtual-network-network-ipam", react_subnet));
216 ReactionMap react_ipam = map_list_of<string, PropagateList>
217 (
"virtual-network-network-ipam", list_of(
"nil"));
218 policy->insert(make_pair(
"network-ipam", react_ipam));
220 ReactionMap react_bgpaas = map_list_of<string, PropagateList>
221 (
"bgpaas-control-node-zone",
222 list_of(
"bgpaas-virtual-machine-interface"));
223 policy->insert(make_pair(
"bgp-as-a-service", react_bgpaas));
238 tracker_->policy_map()->insert(make_pair(node_name, react));
242 for (TableMap::iterator iter =
table_map_.begin();
265 if (state->
notify() ==
true) {
390 bool oper_db_request_enqueued) {
410 node->
SetState(table, loc->second, state);
451 return (strcmp(node->
table()->
Typename(),
"routing-instance") != 0);
455 (
const char *link1,
const char *node1,
bool interest1,
456 const char *link2 = NULL,
const char *node2 = NULL,
bool interest2 =
false,
457 const char *link3 = NULL,
const char *node3 = NULL,
bool interest3 =
false,
458 const char *link4 = NULL,
const char *node4 = NULL,
bool interest4 =
false,
459 const char *link5 = NULL,
const char *node5 = NULL,
bool interest5 =
false,
460 const char *link6 = NULL,
const char *node6 = NULL,
bool interest6 =
false) {
461 if (link2) assert(node2);
462 if (link3) assert(node3);
463 if (link4) assert(node4);
464 if (link5) assert(node5);
465 if (link6) assert(node6);
483 const string &node) {
484 NodeEventPolicy::iterator it = policy->find(node);
485 if (it != policy->end()) {
488 ReactionMap react = map_list_of<string, PropagateList>
490 policy->insert(make_pair(node, react));
491 return policy->find(node);
495 const string &event) {
496 ReactionMap::iterator it = react->find(event);
497 if (it != react->end()) {
501 return react->find(event);
568 NodeEventPolicy::iterator node_it;
572 LOG(DEBUG,
"Updating dependency tacker rules for " << node);
573 react_it->second.insert(
"self");
574 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
575 react_it->first <<
" -> " <<
"self");
577 for (
size_t i = 0; i < path.size(); i++) {
579 if (path[i].vertex_interest_) {
581 react_it->second.insert(path[i].edge_);
582 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
583 react_it->first <<
" -> " << path[i].edge_);
586 if (i < (path.size() - 1)) {
588 react_it->second.insert(path[i].edge_);
589 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
590 react_it->first <<
" -> " << path[i].edge_);
593 react_it->second.insert(
"nil");
594 LOG(DEBUG,
"Adding ReactorMap " << node_it->first <<
" : " <<
595 react_it->first <<
" -> " <<
"nil");
636 MakePath(
"virtual-network-routing-instance",
637 "routing-instance",
true));
639 MakePath(
"virtual-network-access-control-list",
640 "access-control-list",
true));
642 MakePath(
"virtual-network-network-ipam",
643 "virtual-network-network-ipam",
true,
644 "virtual-network-network-ipam",
645 "network-ipam",
false));
647 MakePath(
"virtual-network-qos-config",
648 "qos-config",
true));
650 MakePath(
"virtual-network-security-logging-object",
651 "security-logging-object",
true));
653 MakePath(
"logical-router-virtual-network",
654 "logical-router-virtual-network",
true,
655 "logical-router-virtual-network",
656 "logical-router",
true));
658 MakePath(
"virtual-network-multicast-policy",
659 "multicast-policy",
true));
667 MakePath(
"virtual-network-routing-instance",
668 "virtual-network",
true,
669 "virtual-network-provider-network",
670 "virtual-network",
true));
678 MakePath(
"security-group-access-control-list",
679 "access-control-list",
true));
686 MakePath(
"application-policy-set-tag",
687 "application-policy-set",
true,
688 "policy-management-application-policy-set",
689 "policy-management",
false));
706 MakePath(
"virtual-machine-interface-virtual-network",
707 "virtual-network",
true,
708 "virtual-network-network-ipam",
709 "virtual-network-network-ipam",
true));
711 MakePath(
"virtual-machine-interface-virtual-machine",
712 "virtual-machine",
true));
714 MakePath(
"virtual-machine-interface-sub-interface",
715 "virtual-machine-interface",
true));
718 MakePath(
"virtual-machine-interface-virtual-network",
719 "virtual-network",
true,
720 "virtual-network-provider-network",
721 "virtual-network",
true));
724 MakePath(
"virtual-machine-interface-routing-instance",
725 "virtual-machine-interface-routing-instance",
727 "virtual-machine-interface-routing-instance",
728 "routing-instance",
true));
731 MakePath(
"virtual-machine-interface-security-group",
732 "security-group",
true));
734 MakePath(
"alias-ip-virtual-machine-interface",
736 "alias-ip-pool-alias-ip",
737 "alias-ip-pool",
false,
738 "virtual-network-alias-ip-pool",
739 "virtual-network",
true));
741 MakePath(
"floating-ip-virtual-machine-interface",
743 "floating-ip-pool-floating-ip",
744 "floating-ip-pool",
false,
745 "virtual-network-floating-ip-pool",
746 "virtual-network",
true,
747 "virtual-network-provider-network",
748 "virtual-network",
true));
750 MakePath(
"floating-ip-virtual-machine-interface",
752 "floating-ip-pool-floating-ip",
753 "floating-ip-pool",
false,
754 "virtual-network-floating-ip-pool",
755 "virtual-network",
true,
756 "virtual-network-routing-instance",
757 "routing-instance",
true));
759 MakePath(
"floating-ip-virtual-machine-interface",
761 "instance-ip-floating-ip",
762 "instance-ip",
false,
763 "instance-ip-virtual-network",
764 "virtual-network",
true));
766 MakePath(
"instance-ip-virtual-machine-interface",
767 "instance-ip",
true));
769 MakePath(
"virtual-machine-interface-route-table",
770 "interface-route-table",
true));
772 MakePath(
"subnet-virtual-machine-interface",
775 MakePath(
"logical-interface-virtual-machine-interface",
776 "logical-interface",
false,
777 "physical-interface-logical-interface",
778 "physical-interface",
false,
779 "physical-router-physical-interface",
780 "physical-router",
true));
782 MakePath(
"virtual-port-group-virtual-machine-interface",
783 "virtual-port-group",
false,
784 "virtual-port-group-physical-interface",
785 "physical-interface",
false,
786 "physical-router-physical-interface",
787 "physical-router",
true));
789 MakePath(
"bgpaas-virtual-machine-interface",
790 "bgp-as-a-service",
true,
793 "instance-bgp-router",
794 "routing-instance",
true));
796 MakePath(
"bgpaas-virtual-machine-interface",
797 "bgp-as-a-service",
true,
798 "bgpaas-health-check",
799 "service-health-check",
true));
801 MakePath(
"virtual-machine-interface-qos-config",
802 "qos-config",
true));
804 MakePath(
"virtual-machine-interface-security-logging-object",
805 "security-logging-object",
true));
808 MakePath(
"virtual-machine-interface-bridge-domain",
809 "virtual-machine-interface-bridge-domain",
811 "virtual-machine-interface-bridge-domain",
812 "bridge-domain",
true,
813 "virtual-network-bridge-domain",
814 "virtual-network",
true));
825 MakePath(
"virtual-machine-interface-bridge-domain",
826 "virtual-machine-interface-bridge-domain",
828 "virtual-machine-interface-bridge-domain",
829 "bridge-domain",
true));
832 MakePath(
"virtual-machine-interface-tag",
834 "application-policy-set-tag",
835 "application-policy-set",
true,
836 "application-policy-set-firewall-policy",
837 "application-policy-set-firewall-policy",
true,
838 "application-policy-set-firewall-policy",
839 "firewall-policy",
true));
842 MakePath(
"virtual-machine-interface-virtual-network",
843 "virtual-network",
true,
844 "virtual-network-tag",
"tag",
true,
845 "application-policy-set-tag",
846 "application-policy-set",
true,
847 "application-policy-set-firewall-policy",
848 "application-policy-set-firewall-policy",
true,
849 "application-policy-set-firewall-policy",
850 "firewall-policy",
true));
854 MakePath(
"virtual-machine-interface-virtual-machine",
855 "virtual-machine",
true,
856 "virtual-machine-tag",
"tag",
true,
857 "application-policy-set-tag",
858 "application-policy-set",
true,
859 "application-policy-set-firewall-policy",
860 "application-policy-set-firewall-policy",
true,
861 "application-policy-set-firewall-policy",
862 "firewall-policy",
true));
865 MakePath(
"virtual-machine-interface-sub-interface",
866 "virtual-machine-interface",
true,
867 "virtual-machine-interface-virtual-machine",
868 "virtual-machine",
true,
869 "virtual-machine-tag",
"tag",
true,
870 "application-policy-set-tag",
871 "application-policy-set",
true,
872 "application-policy-set-firewall-policy",
873 "application-policy-set-firewall-policy",
true,
874 "application-policy-set-firewall-policy",
875 "firewall-policy",
true));
878 MakePath(
"project-virtual-machine-interface",
880 "project-tag",
"tag",
true,
881 "application-policy-set-tag",
882 "application-policy-set",
true,
883 "application-policy-set-firewall-policy",
884 "application-policy-set-firewall-policy",
true,
885 "application-policy-set-firewall-policy",
886 "firewall-policy",
true));
893 "port-tuple-interface",
894 "virtual-machine-interface",
true));
896 MakePath(
"logical-router-interface",
897 "logical-router",
true));
905 MakePath(
"physical-router-physical-interface",
906 "physical-router",
true));
911 MakePath(
"virtual-port-group-physical-interface",
912 "virtual-port-group-physical-interface",
true,
913 "virtual-port-group-physical-interface",
914 "virtual-port-group",
true));
924 MakePath(
"physical-interface-logical-interface",
925 "physical-interface",
true,
926 "physical-router-physical-interface",
927 "physical-router",
true));
929 MakePath(
"logical-interface-virtual-machine-interface",
930 "virtual-machine-interface",
true));
932 MakePath(
"physical-router-logical-interface",
933 "physical-router",
true));
941 MakePath(
"physical-router-physical-interface",
942 "physical-interface",
true));
950 MakePath(
"service-port-health-check",
951 "virtual-machine-interface",
true,
952 "virtual-machine-interface-virtual-network",
953 "virtual-network",
false,
954 "virtual-network-network-ipam",
955 "virtual-network-network-ipam",
true));
957 MakePath(
"service-port-health-check",
958 "virtual-machine-interface",
true,
959 "port-tuple-interface",
961 "port-tuple-interface",
962 "virtual-machine-interface",
true,
963 "virtual-machine-interface-virtual-network",
964 "virtual-network",
false,
965 "virtual-network-network-ipam",
966 "virtual-network-network-ipam",
true));
971 MakePath(
"global-qos-config-qos-config",
972 "global-qos-config",
false));
980 MakePath(
"forwarding-class-qos-queue",
990 MakePath(
"security-logging-object-network-policy",
991 "network-policy",
true));
993 MakePath(
"security-logging-object-security-group",
994 "security-group",
true));
996 MakePath(
"firewall-policy-security-logging-object",
997 "firewall-policy-security-logging-object",
true,
998 "firewall-policy-security-logging-object",
999 "firewall-policy",
false));
1001 MakePath(
"firewall-rule-security-logging-object",
1002 "firewall-rule-security-logging-object",
true,
1003 "firewall-rule-security-logging-object",
1004 "firewall-rule",
false));
1012 MakePath(
"virtual-router-sub-cluster",
1013 "sub-cluster",
true,
1014 "bgp-router-sub-cluster",
1015 "bgp-router",
true));
1032 MakePath(
"virtual-network-bridge-domain",
1033 "virtual-network",
true,
1034 "virtual-network-routing-instance",
1035 "routing-instance",
true));
1037 MakePath(
"virtual-network-bridge-domain",
1038 "virtual-network",
true));
1044 MakePath(
"application-policy-set-firewall-policy",
1045 "application-policy-set-firewall-policy",
true,
1046 "application-policy-set-firewall-policy",
1047 "firewall-policy",
true));
1052 MakePath(
"firewall-policy-firewall-rule",
1053 "firewall-policy-firewall-rule",
true,
1054 "firewall-policy-firewall-rule",
1055 "firewall-rule",
true,
1056 "firewall-rule-service-group",
1057 "service-group",
true));
1059 MakePath(
"firewall-policy-firewall-rule",
1060 "firewall-policy-firewall-rule",
true,
1061 "firewall-policy-firewall-rule",
1062 "firewall-rule",
true,
1063 "firewall-rule-address-group",
1064 "address-group",
true,
1065 "address-group-tag",
"tag",
"true"));
1068 MakePath(
"firewall-policy-firewall-rule",
1069 "firewall-policy-firewall-rule",
true,
1070 "firewall-policy-firewall-rule",
1071 "firewall-rule",
true,
1072 "firewall-rule-tag",
1076 MakePath(
"firewall-policy-firewall-rule",
1077 "firewall-policy-firewall-rule",
true,
1078 "firewall-policy-firewall-rule",
1079 "firewall-rule",
true));
1085 void IFMapNodePolicyReq::HandleRequest()
const {
1087 IFMapNodePolicyResp *resp =
new IFMapNodePolicyResp();
1091 NodeEventPolicy::iterator it1 = policy_list->begin();
1092 std::vector<IFMapNodePolicy> resp_policy_list;
1093 while (it1 != policy_list->end()) {
1094 if (it1->first.find(get_node()) == string::npos) {
1099 ReactionMap::iterator it2 = it1->second.begin();
1100 vector<IFMapReactEvent> resp_event_list;
1101 while(it2 != it1->second.end()) {
1102 IFMapReactEvent resp_event;
1103 vector<string> resp_reactor_list;
1104 PropagateList::iterator it3 = it2->second.begin();
1105 while (it3 != it2->second.end()) {
1106 resp_reactor_list.push_back((*it3));
1109 resp_event.set_event(it2->first);
1110 resp_event.set_reactors(resp_reactor_list);
1111 resp_event_list.push_back(resp_event);
1115 IFMapNodePolicy policy;
1116 policy.set_node(it1->first);
1117 policy.set_events(resp_event_list);
1118 resp_policy_list.push_back(policy);
1122 resp->set_policies(resp_policy_list);
1123 resp->set_context(context());
1124 resp->set_more(
false);
virtual void ConfigEventHandler(IFMapNode *node, DBEntry *entry)
InterfaceTable * interface_table() const
VmTable * vm_table() const
ForwardingClassTable * forwarding_class_table() const
TagTable * tag_table() const
QosQueueTable * qos_queue_table() const
VrfTable * vrf_table() const
AgentQosConfigTable * qos_config_table() const
AclTable * acl_table() const
SecurityLoggingObjectTable * slo_table() const
MulticastPolicyTable * mp_table() const
BridgeDomainTable * bridge_domain_table() const
VnTable * vn_table() const
PhysicalDeviceTable * physical_device_table() const
static Agent * GetInstance()
SgTable * sg_table() const
HealthCheckTable * health_check_table() const
PolicySetTable * policy_set_table() const
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
edge_iterator edge_list_begin(DBGraph *graph)
edge_iterator edge_list_end(DBGraph *graph)
ListenerId Register(ChangeCallback callback, const std::string &name="unspecified")
void Unregister(ListenerId listener)
const std::string & name() const
DBTableBase * FindTable(const std::string &name)
void SetRequestEnqueued(IFMapNode *node, bool oper_db_request_enqueued)
DBEntry * GetObject(IFMapNode *node)
void SetNotify(IFMapNode *node, bool notfiy_flag)
void Unregister(const std::string &type)
void InitializeDependencyRules(Agent *agent)
IFMapNodeState * IFMapNodeGet(IFMapNode *node)
void RegisterReactionMap(const char *node_name, const IFMapDependencyTracker::ReactionMap &react)
bool IsRegistered(const IFMapNode *node)
void AddDependencyPath(const std::string &node, Path path)
void PropogateNodeChange(IFMapNode *node)
bool IsNodeIdentifiedByUuid(const IFMapNode *node)
IFMapDependencyManager(DB *database, DBGraph *graph)
boost::intrusive_ptr< IFMapNodeState > IFMapNodePtr
void ChangeListAdd(IFMapNode *node)
virtual ~IFMapDependencyManager()
IFMapNodePtr SetState(IFMapNode *node)
void PropogateNodeAndLinkChange(IFMapNode *node)
std::unique_ptr< IFMapDependencyTracker > tracker_
void Initialize(Agent *agent)
boost::function< void(IFMapNode *, DBEntry *)> ChangeEventHandler
std::unique_ptr< TaskTrigger > trigger_
void Register(const std::string &type, ChangeEventHandler handler)
IFMapDependencyTracker * tracker() const
void SetObject(IFMapNode *node, DBEntry *entry)
void IFMapNodeReset(IFMapNode *node)
void LinkObserver(DBTablePartBase *root, DBEntryBase *db_entry)
void NodeObserver(DBTablePartBase *root, DBEntryBase *db_entry)
std::set< std::string > PropagateList
std::map< std::string, PropagateList > ReactionMap
NodeEventPolicy * policy_map()
std::map< std::string, ReactionMap > NodeEventPolicy
IFMapNode * LeftNode(DB *db)
IFMapNode * RightNode(DB *db)
const std::string & metadata() const
void set_notify(bool flag)
void set_oper_db_request_enqueued(bool oper_db_request_enqueued)
void set_object(DBEntry *object)
IFMapDependencyManager * manager_
static IFMapTable * FindTable(DB *db, const std::string &element_type)
virtual const char * Typename() const =0
OperNetworkIpam * network_ipam() const
OperVirtualDns * virtual_dns() const
GlobalVrouter * global_vrouter() const
GlobalSystemConfig * global_system_config() const
BgpRouterConfig * bgp_router_config() const
GlobalQosConfig * global_qos_config() const
IFMapDependencyManager * dependency_manager()
VRouter * vrouter() const
void ConfigEventHandler(IFMapNode *node, DBEntry *entry)
int GetTaskId(const std::string &name)
static TaskScheduler * GetInstance()
#define IFMAP_AGENT_LINK_DB_NAME
static NodeEventPolicy::iterator LocateNodeEventPolicy(NodeEventPolicy *policy, const string &node)
IFMapDependencyTracker::PropagateList PropagateList
void intrusive_ptr_release(IFMapNodeState *state)
IFMapDependencyTracker::ReactionMap ReactionMap
IFMapDependencyTracker::NodeEventPolicy NodeEventPolicy
static ReactionMap::iterator LocateReactionMap(ReactionMap *react, const string &event)
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)
static void RegisterConfigHandler(IFMapDependencyManager *dep, const char *name, OperIFMapTable *table)
void intrusive_ptr_add_ref(IFMapNodeState *state)
#define LOG(_Level, _Msg)