7 #include <pugixml/pugixml.hpp>
20 #include "sandesh/sandesh_trace.h"
21 #include "cmn/dns_types.h"
25 : channel_(channel), mgr_(mgr) {
46 pugi::xml_node node = pugi->
FindNode(
"dns");
48 std::string source_name = msg->
from;
62 std::unique_ptr<DnsUpdateData> rcv_data) {
71 for (DnsItems::iterator iter = data->
items.begin();
72 iter != data->
items.end();) {
75 if ((*iter).IsDelete()) {
76 change = xmpp_data->
DelItem(*iter);
79 change = xmpp_data->
AddItem(*iter,
true);
87 data->
items.erase(iter++);
89 boost::shared_ptr<DnsAgentXmppChannelManager::RecordRequest>
97 if (!xmpp_data->
items.size()) {
102 for (DnsItems::iterator iter = data->
items.begin();
103 iter != data->
items.end();) {
104 if ((*iter).IsDelete())
105 data->
items.erase(iter++);
107 boost::shared_ptr<DnsAgentXmppChannelManager::RecordRequest>
124 for (DnsItems::const_iterator item = (*it)->items.begin();
125 item != (*it)->items.end(); ++item) {
126 boost::shared_ptr<DnsAgentXmppChannelManager::RecordRequest>
129 (*it)->virtual_dns, *item));
137 std::stringstream str;
138 str << vdns_name <<
":" << item.
type <<
":" << item.
name <<
":" << item.
data;
144 std::vector<AgentDnsDataItem> items;
147 AgentDnsDataItem item;
148 item.set_virtual_dns((*it)->virtual_dns);
149 item.set_zone((*it)->zone);
150 std::vector<VirtualDnsRecordTraceData> records;
151 for (DnsItems::iterator iter = (*it)->items.begin();
152 iter != (*it)->items.end(); ++iter) {
153 VirtualDnsRecordTraceData record;
154 record.rec_name = (*iter).name;
156 record.rec_class =
"IN";
157 record.rec_data = (*iter).data;
158 record.rec_ttl = (*iter).ttl;
159 record.source =
"Agent";
160 record.installed =
"yes";
161 record.rec_source_name = (*iter).source_name;
162 records.push_back(record);
164 item.set_records(records);
165 items.push_back(item);
167 data.set_agent_data(items);
173 work_queue_(
TaskScheduler::GetInstance()->GetTaskId(
"dns::Config"), 0,
191 boost::shared_ptr<RecordRequest> req) {
193 req->vdns_name, req->item);
198 boost::shared_ptr<RecordRequest> req) {
207 DnsAgentXmppChannelManager::DnsAgentXmppChannelManager::FindChannel(
209 tbb::mutex::scoped_lock lock(mutex_);
210 ChannelMap::iterator it = channel_map_.find(ch);
211 if (it == channel_map_.end())
219 tbb::mutex::scoped_lock lock(
mutex_);
226 channel_map_.insert(std::make_pair(channel, agent_xmpp_channel));
231 " Close due to EndofRib not computed");
238 agent_xmpp_channel->
Close();
239 delete agent_xmpp_channel;
242 "Peer not found on channel not ready event");
259 tbb::mutex::scoped_lock lock(
mutex_);
264 agent_data.set_peer(channel->
ToString());
265 agent_data.set_peer_address(
267 agent_data.set_local_address(
269 agent_data.set_state(channel->
StateName());
270 agent_data.set_last_event(channel->
LastEvent());
274 list.push_back(agent_data);
279 tbb::mutex::scoped_lock lock(
mutex_);
289 void ShowAgentList::HandleRequest()
const {
290 DnsAgentListResponse *resp =
new DnsAgentListResponse();
291 resp->set_context(context());
293 std::vector<AgentData> agent_list_sandesh;
296 resp->set_agent(agent_list_sandesh);
300 void ShowAgentXmppDnsData::HandleRequest()
const {
301 AgentXmppDnsDataResponse *resp =
new AgentXmppDnsDataResponse();
302 resp->set_context(context());
304 std::vector<AgentDnsData> agent_data;
307 resp->set_data(agent_data);
virtual const XmppConnection * connection() const =0
pugi::xml_node FindNode(const std::string &name)
void UnRegisterConnectionEvent(xmps::PeerId)
virtual ~DnsAgentXmppChannelManager()
void UpdateDnsRecords(BindUtil::Operation op)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
std::string GetDnsRecordName(std::string &vdns_name, const DnsItem &item)
void Shutdown(bool delete_entries=true)
virtual void RegisterReceive(xmps::PeerId, ReceiveCb)=0
virtual ~DnsAgentXmppChannel()
virtual boost::asio::ip::tcp::endpoint endpoint() const
uint8_t ChannelToDscp(const XmppChannel *xc) const
void HandleAgentUpdate(std::unique_ptr< DnsUpdateData > rcv_data)
void EnqueueRecord(boost::shared_ptr< RecordRequest > req)
ConfigClientManager * get_config_manager()
bool ProcessRecord(boost::shared_ptr< RecordRequest > req)
bool GetEndOfRibComputed() const
void GetAgentData(std::vector< AgentData > &list)
void ProcessAgentUpdate(BindUtil::Operation event, const std::string &name, const std::string &vdns_name, const DnsItem &item)
DnsAgentXmppChannel(XmppChannel *channel, DnsAgentXmppChannelManager *mgr)
virtual std::string LastStateChangeAt() const =0
std::unique_ptr< XmlBase > dom
virtual std::string StateName() const =0
static DnsManager * GetDnsManager()
virtual std::string LastEvent() const =0
void RemoveChannel(XmppChannel *ch)
RecordRequestWorkQueue work_queue_
virtual const std::string & ToString() const =0
virtual void UnRegisterReceive(xmps::PeerId)=0
virtual std::string LastStateName() const =0
bool AddItem(DnsItem &item, bool replace=false) const
void GetAgentDnsData(AgentDnsData &data)
void ReceiveReq(const XmppStanza::XmppMessage *msg)
DnsAgentXmppChannelManager * mgr_
#define DNS_XMPP_TRACE(obj, arg)
bool DelItem(DnsItem &item) const
static bool DnsAgentXmppDecode(const pugi::xml_node dns, XmppType &type, uint32_t &xid, uint16_t &resp_code, DnsUpdateData *data, std::string source_name="")
DnsAgentXmppChannelManager(XmppServer *server)
void HandleXmppChannelEvent(XmppChannel *channel, xmps::PeerState state)
void GetAgentDnsData(std::vector< AgentDnsData > &dt)
virtual void UnRegisterWriteReady(xmps::PeerId id)=0
static uint16_t DnsType(const std::string &tp)
const XmppSession * session() const
virtual boost::asio::ip::tcp::endpoint local_endpoint() const
bool Enqueue(QueueEntryT entry)
virtual std::string PeerAddress() const =0
void RegisterConnectionEvent(xmps::PeerId, ConnectionEventCb)
uint8_t GetDscpValue() const
static DnsAgentXmppChannelManager * GetAgentXmppChannelManager()