OpenSDN source code
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/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 using namespace boost::placeholders;
18 
19 const char *DnsConfigManager::config_types[] = {
20  "virtual-DNS",
21  "virtual-DNS-record",
22  "network-ipam",
23  "virtual-network-network-ipam",
24  "global-qos-config",
25  };
27 
28 const std::string DnsConfigManager::EventString[] = {
29  "None",
30  "Add",
31  "Change",
32  "Delete"
33 };
34 
38 
40 }
41 
43  : id_type(rhs.id_type), id_name(rhs.id_name),
44  node(rhs.node), obj(rhs.obj) {
45 }
46 
48 }
49 
51  : db_(NULL), db_graph_(NULL),
52  trigger_(boost::bind(&DnsConfigManager::ConfigHandler, this),
53  TaskScheduler::GetInstance()->GetTaskId("dns::Config"), 0),
54  listener_(new ConfigListener(this)) {
56 
57  if (config_task_id_ == -1) {
59  config_task_id_ = scheduler->GetTaskId("dns::Config");
60  }
61 }
62 
64 }
65 
66 void DnsConfigManager::Initialize(DB *db, DBGraph *db_graph) {
67  db_ = db;
68  db_graph_ = db_graph;
69  int ntypes = config_types_size / sizeof(const char *);
70  listener_->Initialize(db, ntypes, config_types);
71 }
72 
74  trigger_.Set();
75 }
76 
78  id_map_.insert(make_pair("network-ipam",
79  boost::bind(&DnsConfigManager::ProcessNetworkIpam, this, _1)));
80  id_map_.insert(make_pair("virtual-network-network-ipam",
81  boost::bind(&DnsConfigManager::ProcessVNNI, this, _1)));
82  id_map_.insert(make_pair("virtual-DNS",
83  boost::bind(&DnsConfigManager::ProcessVirtualDNS, this, _1)));
84  id_map_.insert(make_pair("virtual-DNS-record",
85  boost::bind(&DnsConfigManager::ProcessVirtualDNSRecord, this, _1)));
86  id_map_.insert(make_pair("global-qos-config",
87  boost::bind(&DnsConfigManager::ProcessGlobalQosConfig, this, _1)));
88 }
89 
91  DnsConfigData &config_data,
92  Observer observer) {
93  IFMapNodeProxy *proxy = config_data.Find(delta.id_name);
94  if (!proxy) {
95  proxy = delta.node.get();
96  if (proxy == NULL)
97  return;
98  IFMapNode *node = proxy->node();
99  if (node == NULL || node->IsDeleted())
100  return;
101  config_data.Add(delta.id_name, delta.node);
102  if (observer) {
103  (observer)(proxy, delta.id_name, DnsConfigManager::CFG_ADD);
104  }
105  DNS_TRACE(DnsConfigTrace, "Add : Type = " + delta.id_type +
106  " Name = " + delta.id_name);
107  } else {
108  IFMapNode *node = proxy->node();
109  if (node->IsDeleted() || !node->HasAdjacencies(db_graph_)) {
110  if (observer) {
111  (observer)(proxy, delta.id_name,
113  }
114  config_data.Del(delta.id_name);
115  DNS_TRACE(DnsConfigTrace, "Delete : Type = " + delta.id_type +
116  " Name = " + delta.id_name);
117  } else {
118  if (observer) {
119  (observer)(proxy, delta.id_name,
121  }
122  DNS_TRACE(DnsConfigTrace, "Change : Type = " + delta.id_type +
123  " Name = " + delta.id_name);
124  }
125  }
126 }
127 
129  if (!delta.id_name.size()) {
130  DNS_TRACE(DnsConfigTrace, "Error - Received Virtual DNS without a name");
131  return;
132  }
134 }
135 
137  if (!delta.id_name.size()) {
138  DNS_TRACE(DnsConfigTrace, "Error - Received Virtual DNS Record without a name");
139  return;
140  }
142 }
143 
145  if (!delta.id_name.size()) {
146  DNS_TRACE(DnsConfigTrace, "Error - Received VNNI without a name");
147  return;
148  }
150 }
151 
153  if (!delta.id_name.size()) {
154  DNS_TRACE(DnsConfigTrace, "Error - Received Ipam without a name");
155  return;
156  }
158 }
159 
161  if (!delta.id_name.size()) {
162  DNS_TRACE(DnsConfigTrace, "Error - Received GlobalQosConfig without a"
163  " name");
164  return;
165  }
167 }
168 
170  std::string link_name) {
172  iter != node->edge_list_end(graph()); ++iter) {
173  IFMapLink *link = static_cast<IFMapLink *>(iter.operator->());
174  if (link->metadata() == link_name)
175  return static_cast<IFMapNode *>(iter.target());
176  }
177  return NULL;
178 }
179 
181  std::string link_name,
182  std::string node_type) {
184  iter != node->edge_list_end(graph()); ++iter) {
185  IFMapLink *link = static_cast<IFMapLink *>(iter.operator->());
186  if (link->metadata() == link_name) {
187  IFMapNode *targ_node = static_cast<IFMapNode *>(iter.target());
188  if (targ_node->table()->Typename() == node_type)
189  return targ_node;
190  }
191  }
192  return NULL;
193 }
194 
196  for (ChangeList::const_iterator iter = change_list.begin();
197  iter != change_list.end(); ++iter) {
198  IdentifierMap::iterator loc = id_map_.find(iter->id_type);
199  if (loc != id_map_.end()) {
200  (loc->second)(*iter);
201  }
202  }
203 }
204 
206  ConfigListener::ChangeList change_list;
207  listener_->GetChangeList(&change_list);
208  ProcessChanges(change_list);
209  return true;
210 }
211 
213  listener_->Terminate(db_);
214 }
215 
std::vector< ConfigDelta > ChangeList
bool IsDeleted() const
Definition: db_entry.h:48
edge_iterator edge_list_begin(DBGraph *graph)
bool HasAdjacencies(DBGraph *graph) const
edge_iterator edge_list_end(DBGraph *graph)
Definition: db.h:24
boost::function< void(IFMapNodeProxy *, const std::string &, EventType)> Observer
Definition: dns_config.h:86
DnsConfigData global_qos_config_
Definition: dns_config.h:139
static const std::string EventString[]
Definition: dns_config.h:82
void ProcessGlobalQosConfig(const ConfigDelta &delta)
Definition: dns_config.cc:160
boost::scoped_ptr< ConfigListener > listener_
Definition: dns_config.h:142
static int config_task_id_
Definition: dns_config.h:129
void ProcessVNNI(const ConfigDelta &delta)
Definition: dns_config.cc:144
IdentifierMap id_map_
Definition: dns_config.h:134
DBGraph * db_graph_
Definition: dns_config.h:132
void ProcessNode(const ConfigDelta &delta, DnsConfigData &config_data, Observer observer)
Definition: dns_config.cc:90
DBGraph * graph()
Definition: dns_config.h:101
virtual ~DnsConfigManager()
Definition: dns_config.cc:63
DnsConfigData virt_dns_rec_config_
Definition: dns_config.h:138
DnsConfigData vnni_config_
Definition: dns_config.h:136
Observers obs_
Definition: dns_config.h:140
void IdentifierMapInit()
Definition: dns_config.cc:77
TaskTrigger trigger_
Definition: dns_config.h:141
IFMapNode * FindTarget(IFMapNode *node, std::string link_name)
Definition: dns_config.cc:169
std::vector< ConfigDelta > ChangeList
Definition: dns_config.h:114
void ProcessVirtualDNSRecord(const ConfigDelta &delta)
Definition: dns_config.cc:136
DnsConfigData ipam_config_
Definition: dns_config.h:135
static const char * config_types[]
Definition: dns_config.h:83
void Initialize(DB *db, DBGraph *db_graph)
Definition: dns_config.cc:66
static const int kConfigTaskInstanceId
Definition: dns_config.h:75
void ProcessVirtualDNS(const ConfigDelta &delta)
Definition: dns_config.cc:128
static uint32_t config_types_size
Definition: dns_config.h:84
DnsConfigData virt_dns_config_
Definition: dns_config.h:137
void ProcessNetworkIpam(const ConfigDelta &delta)
Definition: dns_config.cc:152
bool ConfigHandler()
Definition: dns_config.cc:205
void ProcessChanges(const ChangeList &change_list)
Definition: dns_config.cc:195
IFMapNode * node()
IFMapTable * table()
Definition: ifmap_node.h:29
virtual const char * Typename() const =0
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
Definition: task.h:304
int GetTaskId(const std::string &name)
Definition: task.cc:861
static TaskScheduler * GetInstance()
Definition: task.cc:554
SandeshTraceBufferPtr DnsConfigTraceBuf(SandeshTraceBufferCreate("Config", 2000))
#define DNS_TRACE(Obj,...)
Definition: dns_config.h:34
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
Definition: sandesh_trace.h:46
std::string id_type
Definition: dns_config.h:45
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
IFMapNodeProxy * Find(std::string name)
Definition: dns_config.h:65
void Del(std::string name)
Definition: dns_config.h:61