OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
qos_queue.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <cmn/agent.h>
6 #include <agent_types.h>
7 #include <vnc_cfg_types.h>
8 #include <oper/agent_sandesh.h>
9 #include <oper_db.h>
10 #include <oper/config_manager.h>
11 #include <qos_queue.h>
12 #include <init/agent_param.h>
13 
15  uuid_(uuid), id_(QosQueueTable::kInvalidIndex) {
16 }
17 
19 }
20 
22  QosQueueKey *key = new QosQueueKey(uuid_);
23  return DBEntryBase::KeyPtr(key);
24 }
25 
26 std::string QosQueue::ToString() const {
27  std::ostringstream buffer;
28  buffer << uuid_;
29  return buffer.str();
30 }
31 
32 bool QosQueue::DBEntrySandesh(Sandesh *sresp, std::string &name) const {
33  QosQueueSandeshResp *resp = static_cast<QosQueueSandeshResp *>(sresp);
34  QosQueueSandeshData data;
35  data.set_uuid(UuidToString(uuid_));
36  data.set_id(id_);
37  data.set_name(name_);
38 
39  std::vector<QosQueueSandeshData> &list =
40  const_cast<std::vector<QosQueueSandeshData>&>(resp->get_qos_queue_list());
41  list.push_back(data);
42  return true;
43 }
44 
45 bool QosQueue::IsLess(const DBEntry &rhs) const {
46  const QosQueue &qos_q = static_cast<const QosQueue &>(rhs);
47  return (uuid_ < qos_q.uuid_);
48 }
49 
51  AgentDBTable *table = static_cast<AgentDBTable *>(get_table());
52  nic_queue_id_ = table->agent()->params()->get_nic_queue(id_);
53 }
54 
55 bool QosQueue::Change(const DBRequest *req) {
56  const AgentDBTable *table = static_cast<const AgentDBTable *>(get_table());
57  const QosQueueData *data = static_cast<const QosQueueData *>(req->data.get());
58  bool ret = false;
59 
60  if (name_ != data->name_) {
61  name_ = data->name_;
62  ret = true;
63  }
64 
65  if (id_ != data->id_) {
66  id_ = data->id_;
67  if (table) {
68  nic_queue_id_ = table->agent()->params()->get_nic_queue(id_);
69  }
70  ret = true;
71  }
72 
73  return ret;
74 }
75 
76 void QosQueue::Delete(const DBRequest *req) {
77 }
78 
79 void QosQueue::SetKey(const DBRequestKey *key) {
80  const QosQueueKey *qos_q_key =
81  static_cast<const QosQueueKey *>(key);
82  uuid_ = qos_q_key->uuid_;
83 }
84 
86  DB *db, const std::string &name):
87  AgentOperDBTable(db, name) {
88  set_agent(agent);
89 }
90 
92 }
93 
95 QosQueueTable::CreateTable(Agent *agent, DB *db, const std::string &name) {
96  QosQueueTable *qos_q_table = new QosQueueTable(agent, db, name);
97  (static_cast<DBTable *>(qos_q_table))->Init();
98  return qos_q_table;
99 }
100 
101 std::unique_ptr<DBEntry>
103  const QosQueueKey *key =
104  static_cast<const QosQueueKey *>(k);
105  QosQueue *qos_q = new QosQueue(key->uuid_);
106  return std::unique_ptr<DBEntry>(static_cast<DBEntry *>(qos_q));
107 }
108 
110  const QosQueueKey *key =
111  static_cast<const QosQueueKey *>(req->key.get());
112  QosQueue *qos_q = new QosQueue(key->uuid_);
113  qos_q->set_id(index_table_.Insert(qos_q));
114  qos_q->Change(req);
115  return static_cast<DBEntry *>(qos_q);
116 }
117 
119  QosQueue *qos_q = static_cast<QosQueue *>(entry);
120  return qos_q->Change(req);
121 }
122 
124  return OperDBOnChange(entry, req);
125 }
126 
128  return true;
129 }
130 
132  const boost::uuids::uuid &u) {
133  assert(!u.is_nil());
134  if ((req.oper == DBRequest::DB_ENTRY_DELETE) || node->IsDeleted()) {
135  req.key.reset(new QosQueueKey(u));
137  Enqueue(&req);
138  return false;
139  }
140 
142  return false;
143 }
144 
146  autogen::QosQueue *cfg = static_cast <autogen::QosQueue *> (node->GetObject());
147  assert(cfg);
148  autogen::IdPermsType id_perms = cfg->id_perms();
149  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong, u);
150  return true;
151 }
152 
153 
155  const boost::uuids::uuid &u) {
156  if (node->IsDeleted()) {
157  return false;
158  }
159 
160  autogen::QosQueue *cfg = static_cast <autogen::QosQueue *> (node->GetObject());
162  req.key.reset(new QosQueueKey(u));
163  req.data.reset(new QosQueueData(agent(), node, node->name(),
164  cfg->identifier()));
165  Enqueue(&req);
166  return false;
167 }
168 
170 }
171 
174  const std::string &context) {
175  return AgentSandeshPtr(new QosQueueSandesh(context,
176  args->GetString("uuid"), args->GetString("name"),
177  args->GetString("id")));
178 }
179 
180 void QosQueueSandeshReq::HandleRequest() const {
181  AgentSandeshPtr sand(new QosQueueSandesh(context(), get_uuid(),
182  get_name(), get_id()));
183  sand->DoSandesh(sand);
184 }
185 
186 void AddQosQueue::HandleRequest() const {
187  QosResponse *resp = new QosResponse();
188  resp->set_context(context());
189  resp->set_resp("Success");
190 
192  DBRequest req;
193  char str[50];
194  sprintf(str, "00000000-0000-0000-0000-00%010x", get_uuid());
195  boost::uuids::uuid u1 = StringToUuid(std::string(str));
197  req.key.reset(new QosQueueKey(u1));
198  req.data.reset(new QosQueueData(NULL, NULL, get_name(), get_id()));
199  table->Enqueue(&req);
200  resp->Response();
201 }
202 
203 void DeleteQosQueue::HandleRequest() const {
204  QosResponse *resp = new QosResponse();
205  resp->set_context(context());
206  resp->set_resp("Success");
207 
208  char str[50];
209  sprintf(str, "00000000-0000-0000-0000-00%010x", get_uuid());
210  boost::uuids::uuid u1 = StringToUuid(std::string(str));
211 
213  DBRequest req;
215  req.key.reset(new QosQueueKey(u1));
216  req.data.reset(NULL);
217  table->Enqueue(&req);
218  resp->Response();
219 }
void set_id(uint32_t id)
Definition: qos_queue.h:66
uint16_t id_
Definition: qos_queue.h:80
std::string name_
Definition: qos_queue.h:81
virtual void PostAdd()
Definition: qos_queue.cc:50
static Agent * GetInstance()
Definition: agent.h:436
static boost::uuids::uuid StringToUuid(const std::string &str)
Definition: string_util.h:145
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
Definition: agent_cmn.h:67
std::string GetString(const std::string &key) const
DBTableBase * get_table() const
Definition: db_entry.cc:119
bool IsDeleted() const
Definition: db_entry.h:49
ConfigManager * config_manager() const
Definition: agent.cc:889
Agent * agent() const
Definition: agent_db.h:213
std::unique_ptr< DBRequestData > data
Definition: db_table.h:49
bool Enqueue(DBRequest *req)
Definition: db_table.cc:194
boost::uuids::uuid uuid
uint16_t nic_queue_id_
Definition: qos_queue.h:82
static std::string UuidToString(const boost::uuids::uuid &id)
Definition: string_util.h:138
QosQueue(const boost::uuids::uuid &uuid)
Definition: qos_queue.cc:14
IndexVector< QosQueue * > index_table_
Definition: qos_queue.h:114
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
KeyPtr GetDBRequestKey() const
Definition: qos_queue.cc:21
std::string name_
Definition: qos_queue.h:34
QosQueueTable * qos_queue_table() const
Definition: agent.h:562
Definition: db.h:24
virtual bool OperDBOnChange(DBEntry *entry, const DBRequest *req)
Definition: qos_queue.cc:118
virtual bool IFNodeToReq(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
Definition: qos_queue.cc:131
size_t Insert(EntryType entry)
Definition: index_vector.h:40
void AddQosQueueNode(IFMapNode *node)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
Definition: qos_queue.cc:102
Definition: agent.h:358
void ReleaseIndex(QosQueue *qos_queue)
Definition: qos_queue.cc:169
std::unique_ptr< DBRequestKey > key
Definition: db_table.h:48
virtual ~QosQueueTable()
Definition: qos_queue.cc:91
DBOperation oper
Definition: db_table.h:42
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
Definition: qos_queue.cc:173
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
virtual ~QosQueue()
Definition: qos_queue.cc:18
virtual void SetKey(const DBRequestKey *key)
Definition: qos_queue.cc:79
AgentParam * params() const
Definition: agent.h:1218
virtual bool OperDBResync(DBEntry *entry, const DBRequest *req)
Definition: qos_queue.cc:123
std::string ToString() const
Definition: qos_queue.cc:26
const std::string & name() const
Definition: ifmap_node.h:48
QosQueueTable(Agent *agent, DB *db, const std::string &name)
Definition: qos_queue.cc:85
virtual bool OperDBDelete(DBEntry *entry, const DBRequest *req)
Definition: qos_queue.cc:127
void Delete()
Definition: db_entry.cc:131
IFMapObject * GetObject()
Definition: ifmap_node.cc:63
uint16_t id_
Definition: qos_queue.h:35
boost::uuids::uuid uuid_
Definition: qos_queue.h:79
virtual bool ProcessConfig(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
Definition: qos_queue.cc:154
uint16_t get_nic_queue(uint16_t queue)
Definition: agent_param.h:513
virtual bool IsLess(const DBEntry &rhs) const
Definition: qos_queue.cc:45
static DBTableBase * CreateTable(Agent *agent, DB *db, const std::string &name)
Definition: qos_queue.cc:95
virtual bool DBEntrySandesh(Sandesh *resp, std::string &name) const
Definition: qos_queue.cc:32
virtual DBEntry * OperDBAdd(const DBRequest *req)
Definition: qos_queue.cc:109
boost::uuids::uuid uuid_
Definition: qos_queue.h:26
virtual bool IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &u)
Definition: qos_queue.cc:145
virtual bool Change(const DBRequest *req)
Definition: qos_queue.cc:55
void set_agent(Agent *agent)
Definition: agent_db.h:212