OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dns_config.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <boost/bind.hpp>
6 #include "base/logging.h"
7 #include "base/task.h"
8 #include "base/util.h"
9 #include "bind/bind_util.h"
10 #include "cfg/dns_config.h"
11 #include "cfg/config_listener.h"
12 #include "ifmap/ifmap_link.h"
13 #include "ifmap/ifmap_table.h"
14 #include "cmn/dns.h"
15 
16 using namespace std;
17 
18 const char *DnsConfigManager::config_types[] = {
19  "virtual-DNS",
20  "virtual-DNS-record",
21  "network-ipam",
22  "virtual-network-network-ipam",
23  "global-qos-config",
24  };
26 
27 const std::string DnsConfigManager::EventString[] = {
28  "None",
29  "Add",
30  "Change",
31  "Delete"
32 };
33 
37 
39 }
40 
42  : id_type(rhs.id_type), id_name(rhs.id_name),
43  node(rhs.node), obj(rhs.obj) {
44 }
45 
47 }
48 
50  : db_(NULL), db_graph_(NULL),
51  trigger_(boost::bind(&DnsConfigManager::ConfigHandler, this),
52  TaskScheduler::GetInstance()->GetTaskId("dns::Config"), 0),
53  listener_(new ConfigListener(this)) {
55 
56  if (config_task_id_ == -1) {
58  config_task_id_ = scheduler->GetTaskId("dns::Config");
59  }
60 }
61 
63 }
64 
65 void DnsConfigManager::Initialize(DB *db, DBGraph *db_graph) {
66  db_ = db;
67  db_graph_ = db_graph;
68  int ntypes = config_types_size / sizeof(const char *);
69  listener_->Initialize(db, ntypes, config_types);
70 }
71 
73  trigger_.Set();
74 }
75 
77  id_map_.insert(make_pair("network-ipam",
78  boost::bind(&DnsConfigManager::ProcessNetworkIpam, this, _1)));
79  id_map_.insert(make_pair("virtual-network-network-ipam",
80  boost::bind(&DnsConfigManager::ProcessVNNI, this, _1)));
81  id_map_.insert(make_pair("virtual-DNS",
82  boost::bind(&DnsConfigManager::ProcessVirtualDNS, this, _1)));
83  id_map_.insert(make_pair("virtual-DNS-record",
84  boost::bind(&DnsConfigManager::ProcessVirtualDNSRecord, this, _1)));
85  id_map_.insert(make_pair("global-qos-config",
86  boost::bind(&DnsConfigManager::ProcessGlobalQosConfig, this, _1)));
87 }
88 
90  DnsConfigData &config_data,
91  Observer observer) {
92  IFMapNodeProxy *proxy = config_data.Find(delta.id_name);
93  if (!proxy) {
94  proxy = delta.node.get();
95  if (proxy == NULL)
96  return;
97  IFMapNode *node = proxy->node();
98  if (node == NULL || node->IsDeleted())
99  return;
100  config_data.Add(delta.id_name, delta.node);
101  if (observer) {
102  (observer)(proxy, delta.id_name, DnsConfigManager::CFG_ADD);
103  }
104  DNS_TRACE(DnsConfigTrace, "Add : Type = " + delta.id_type +
105  " Name = " + delta.id_name);
106  } else {
107  IFMapNode *node = proxy->node();
108  if (node->IsDeleted() || !node->HasAdjacencies(db_graph_)) {
109  if (observer) {
110  (observer)(proxy, delta.id_name,
112  }
113  config_data.Del(delta.id_name);
114  DNS_TRACE(DnsConfigTrace, "Delete : Type = " + delta.id_type +
115  " Name = " + delta.id_name);
116  } else {
117  if (observer) {
118  (observer)(proxy, delta.id_name,
120  }
121  DNS_TRACE(DnsConfigTrace, "Change : Type = " + delta.id_type +
122  " Name = " + delta.id_name);
123  }
124  }
125 }
126 
128  if (!delta.id_name.size()) {
129  DNS_TRACE(DnsConfigTrace, "Error - Received Virtual DNS without a name");
130  return;
131  }
133 }
134 
136  if (!delta.id_name.size()) {
137  DNS_TRACE(DnsConfigTrace, "Error - Received Virtual DNS Record without a name");
138  return;
139  }
141 }
142 
144  if (!delta.id_name.size()) {
145  DNS_TRACE(DnsConfigTrace, "Error - Received VNNI without a name");
146  return;
147  }
149 }
150 
152  if (!delta.id_name.size()) {
153  DNS_TRACE(DnsConfigTrace, "Error - Received Ipam without a name");
154  return;
155  }
157 }
158 
160  if (!delta.id_name.size()) {
161  DNS_TRACE(DnsConfigTrace, "Error - Received GlobalQosConfig without a"
162  " name");
163  return;
164  }
166 }
167 
169  std::string link_name) {
171  iter != node->edge_list_end(graph()); ++iter) {
172  IFMapLink *link = static_cast<IFMapLink *>(iter.operator->());
173  if (link->metadata() == link_name)
174  return static_cast<IFMapNode *>(iter.target());
175  }
176  return NULL;
177 }
178 
180  std::string link_name,
181  std::string node_type) {
183  iter != node->edge_list_end(graph()); ++iter) {
184  IFMapLink *link = static_cast<IFMapLink *>(iter.operator->());
185  if (link->metadata() == link_name) {
186  IFMapNode *targ_node = static_cast<IFMapNode *>(iter.target());
187  if (targ_node->table()->Typename() == node_type)
188  return targ_node;
189  }
190  }
191  return NULL;
192 }
193 
195  for (ChangeList::const_iterator iter = change_list.begin();
196  iter != change_list.end(); ++iter) {
197  IdentifierMap::iterator loc = id_map_.find(iter->id_type);
198  if (loc != id_map_.end()) {
199  (loc->second)(*iter);
200  }
201  }
202 }
203 
205  ConfigListener::ChangeList change_list;
206  listener_->GetChangeList(&change_list);
207  ProcessChanges(change_list);
208  return true;
209 }
210 
212  listener_->Terminate(db_);
213 }
214 
static const char * config_types[]
Definition: dns_config.h:83
static int config_task_id_
Definition: dns_config.h:129
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:178
void ProcessVirtualDNS(const ConfigDelta &delta)
Definition: dns_config.cc:127
DnsConfigData vnni_config_
Definition: dns_config.h:136
void ProcessChanges(const ChangeList &change_list)
Definition: dns_config.cc:194
bool IsDeleted() const
Definition: db_entry.h:49
IdentifierMap id_map_
Definition: dns_config.h:134
void ProcessGlobalQosConfig(const ConfigDelta &delta)
Definition: dns_config.cc:159
virtual const char * Typename() const =0
boost::scoped_ptr< ConfigListener > listener_
Definition: dns_config.h:142
virtual ~DnsConfigManager()
Definition: dns_config.cc:62
std::vector< ConfigDelta > ChangeList
IFMapTable * table()
Definition: ifmap_node.h:29
IFMapNode * FindTarget(IFMapNode *node, std::string link_name)
Definition: dns_config.cc:168
static const std::string EventString[]
Definition: dns_config.h:82
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
SandeshTraceBufferPtr DnsConfigTraceBuf
bool HasAdjacencies(DBGraph *graph) const
boost::function< void(IFMapNodeProxy *, const std::string &, EventType)> Observer
Definition: dns_config.h:86
std::string id_type
Definition: dns_config.h:45
int GetTaskId(const std::string &name)
Definition: task.cc:856
Definition: db.h:24
DnsConfigData global_qos_config_
Definition: dns_config.h:139
void ProcessVirtualDNSRecord(const ConfigDelta &delta)
Definition: dns_config.cc:135
DnsConfigData ipam_config_
Definition: dns_config.h:135
void ProcessVNNI(const ConfigDelta &delta)
Definition: dns_config.cc:143
bool ConfigHandler()
Definition: dns_config.cc:204
DnsConfigData virt_dns_rec_config_
Definition: dns_config.h:138
static TaskScheduler * GetInstance()
Definition: task.cc:547
#define DNS_TRACE(Obj,...)
Definition: dns_config.h:34
void ProcessNode(const ConfigDelta &delta, DnsConfigData &config_data, Observer observer)
Definition: dns_config.cc:89
DBGraph * db_graph_
Definition: dns_config.h:132
Observers obs_
Definition: dns_config.h:140
std::vector< ConfigDelta > ChangeList
Definition: dns_config.h:114
void IdentifierMapInit()
Definition: dns_config.cc:76
IFMapNodeProxy * Find(std::string name)
Definition: dns_config.h:65
TaskTrigger trigger_
Definition: dns_config.h:141
DBGraph * graph()
Definition: dns_config.h:101
static uint32_t config_types_size
Definition: dns_config.h:84
IFMapNode * node()
edge_iterator edge_list_end(DBGraph *graph)
DnsConfigData virt_dns_config_
Definition: dns_config.h:137
void Initialize(DB *db, DBGraph *db_graph)
Definition: dns_config.cc:65
void ProcessNetworkIpam(const ConfigDelta &delta)
Definition: dns_config.cc:151
IFMapNodeProxyRef node
Definition: dns_config.h:47
std::string id_name
Definition: dns_config.h:46
void Add(std::string name, IFMapNodeProxyRef node)
Definition: dns_config.h:57
static const int kConfigTaskInstanceId
Definition: dns_config.h:75
void Del(std::string name)
Definition: dns_config.h:61
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
Definition: sandesh_trace.h:46
edge_iterator edge_list_begin(DBGraph *graph)