OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
vm.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <boost/uuid/uuid_io.hpp>
6 #include <vnc_cfg_types.h>
7 #include <cmn/agent_cmn.h>
8 
9 #include <ifmap/ifmap_node.h>
10 #include <oper/interface_common.h>
11 #include <oper/vm.h>
12 #include <oper/mirror_table.h>
13 #include <oper/agent_sandesh.h>
14 #include <oper/config_manager.h>
15 
16 using namespace std;
17 using namespace autogen;
18 using boost::uuids::nil_uuid;
19 
21 
22 VmEntry::VmEntry(const boost::uuids::uuid &id) : uuid_(id), name_(""),
23  drop_new_flows_(false) {
24  flow_count_ = 0;
26 }
27 
29  assert(flow_count_ == 0);
30  assert(linklocal_flow_count_ == 0);
31 }
32 
33 bool VmEntry::IsLess(const DBEntry &rhs) const {
34  const VmEntry &a = static_cast<const VmEntry &>(rhs);
35  return (uuid_ < a.uuid_);
36 }
37 
38 string VmEntry::ToString() const {
39  return UuidToString(GetUuid());
40 }
41 
43  VmKey *key = new VmKey(uuid_);
44  return DBEntryBase::KeyPtr(key);
45 }
46 
47 void VmEntry::SetKey(const DBRequestKey *key) {
48  const VmKey *k = static_cast<const VmKey *>(key);
49  uuid_ = k->uuid_;
50 }
51 
52 bool VmEntry::DBEntrySandesh(Sandesh *sresp, std::string &name) const {
53  VmListResp *resp = static_cast<VmListResp *>(sresp);
54 
55  std::string str_uuid = UuidToString(GetUuid());
56  if (name.empty() || str_uuid == name) {
57  VmSandeshData data;
58  data.set_uuid(str_uuid);
59  std::vector<VmSandeshData> &list =
60  const_cast<std::vector<VmSandeshData>&>(resp->get_vm_list());
61  data.set_drop_new_flows(drop_new_flows_);
62  list.push_back(data);
63  return true;
64  }
65 
66  return false;
67 }
68 
69 void VmEntry::update_flow_count(int val) const {
70  VmTable *vm_table = static_cast<VmTable *>(get_table());
71  int max_flows = vm_table->agent()->max_vm_flows();
72  int tmp = flow_count_.fetch_and_add(val);
73 
74  if (max_flows == 0) {
75  // max_flows are not configured,
76  // disable drop new flows and return
78  return;
79  }
80 
81  if (val < 0) {
82  assert(tmp >= val);
83  if ((tmp + val) <
84  ((max_flows * (Agent::kDropNewFlowsRecoveryThreshold))/100)) {
86  }
87  } else {
88  if ((tmp + val) >= max_flows) {
90  }
91  }
92 }
93 
94 void VmEntry::SetInterfacesDropNewFlows(bool drop_new_flows) const {
95  if (drop_new_flows_ == drop_new_flows) {
96  return;
97  }
99  VmTable *vm_table = static_cast<VmTable *>(get_table());
100  DBRequest req;
102  tbb::mutex::scoped_lock lock(back_ref_mutex_);
103  std::set<IntrusiveReferrer>::const_iterator it = back_ref_set_.begin();
104  for (; it != back_ref_set_.end(); it++) {
105  VmInterface *vm_intf = static_cast<VmInterface *>((*it).first);
106  if (vm_intf->max_flows())
107  continue;
108  req.key.reset(new VmInterfaceKey(AgentKey::RESYNC,
109  vm_intf->GetUuid(), ""));
110  req.data.reset(new VmInterfaceNewFlowDropData(drop_new_flows));
111  vm_table->agent()->interface_table()->Enqueue(&req);
112  }
113 }
114 
116  VmObjectLogInfo info;
117  string str;
118  string str_uuid = UuidToString(GetUuid());
119  vector<string> sg_list;
120 
121  switch (event) {
122  case AgentLogEvent::ADD:
123  str.assign("Addition ");
124  break;
125  case AgentLogEvent::DEL:
126  str.assign("Deletion ");
127  break;
128  case AgentLogEvent::CHANGE:
129  str.assign("Modification ");
130  break;
131  default:
132  str.assign("");
133  break;
134  }
135  info.set_event(str);
136  info.set_uuid(str_uuid);
137  if (event != AgentLogEvent::DEL && sg_list.size()) {
138  info.set_sg_uuid_list(sg_list);
139  }
140  info.set_ref_count(GetRefCount());
141  VM_OBJECT_LOG_LOG("AgentVm", SandeshLevel::SYS_INFO, info);
142 }
143 
144 boost::uuids::uuid VmTable::GetVmUuid(const std::string &name)
145 {
146  VmNameUuidTree::iterator it = vm_name_uuid_tree_.find(name);
147  if (it != vm_name_uuid_tree_.end()) {
148  return it->second;
149  }
150  return nil_uuid();
151 }
152 
153 std::unique_ptr<DBEntry> VmTable::AllocEntry(const DBRequestKey *k) const {
154  const VmKey *key = static_cast<const VmKey *>(k);
155  VmEntry *vm = new VmEntry(key->uuid_);
156  return std::unique_ptr<DBEntry>(static_cast<DBEntry *>(vm));
157 }
158 
160  VmKey *key = static_cast<VmKey *>(req->key.get());
161  VmData *data = static_cast<VmData *>(req->data.get());
162  VmEntry *vm = new VmEntry(key->uuid_);
163  vm->SetCfgName(data->name_);
164  vm->SendObjectLog(AgentLogEvent::ADD);
165  VmNameUuidTree::iterator it = vm_name_uuid_tree_.find(data->name_);
166  if (it != vm_name_uuid_tree_.end()) {
167  std::swap(vm_name_uuid_tree_[data->name_], key->uuid_);
168  } else {
169  vm_name_uuid_tree_.insert(std::make_pair(data->name_, key->uuid_));
170  }
171  return vm;
172 }
173 
174 // Do DIFF walk for Interface and SG List.
175 bool VmTable::OperDBOnChange(DBEntry *entry, const DBRequest *req) {
176  VmEntry *vm = static_cast<VmEntry *>(entry);
177  vm->SendObjectLog(AgentLogEvent::CHANGE);
178  return false;
179 }
180 
181 bool VmTable::OperDBDelete(DBEntry *entry, const DBRequest *req) {
182  VmEntry *vm = static_cast<VmEntry *>(entry);
183  vm->SendObjectLog(AgentLogEvent::DEL);
184  VmNameUuidTree::const_iterator it =
185  vm_name_uuid_tree_.find(vm->GetCfgName());
186  if (it != vm_name_uuid_tree_.end()) {
187  vm_name_uuid_tree_.erase(it->first);
188  }
189 
190  return true;
191 }
192 
193 DBTableBase *VmTable::CreateTable(DB *db, const std::string &name) {
194  vm_table_ = new VmTable(db, name);
195  vm_table_->Init();
196  return vm_table_;
197 };
199  VirtualMachine *cfg = static_cast <VirtualMachine *> (node->GetObject());
200  assert(cfg);
201  autogen::IdPermsType id_perms = cfg->id_perms();
202  CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong, u);
203  return true;
204 }
205 
207  const boost::uuids::uuid &id) {
208 
209  if ((req.oper == DBRequest::DB_ENTRY_DELETE) || node->IsDeleted()) {
210  req.key.reset(new VmKey(id));
212  return true;
213  }
214 
215  agent()->config_manager()->AddVmNode(node);
216  return false;
217 }
218 
220  const boost::uuids::uuid &id) {
221 
222  if (node->IsDeleted()) {
223  return false;
224  }
225 
226  req.key.reset(new VmKey(id));
227  VmData::SGUuidList sg_list(0);
228  req.data.reset(new VmData(agent(), node, node->name(), sg_list));
230  return true;
231 }
232 
233 void VmListReq::HandleRequest() const {
234  AgentSandeshPtr sand(new AgentVmSandesh(context(), get_uuid()));
235  sand->DoSandesh(sand);
236 }
237 
239  const std::string &context) {
240  return AgentSandeshPtr(new AgentVmSandesh(context,
241  args->GetString("name")));
242 }
static VmTable * vm_table_
Definition: vm.h:104
virtual string ToString() const
Definition: vm.cc:38
void update_flow_count(int val) const
Definition: vm.cc:69
std::set< IntrusiveReferrer > back_ref_set_
Definition: agent_db.h:63
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *k) const
Definition: vm.cc:153
const string & GetCfgName() const
Definition: vm.h:43
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
Definition: agent_cmn.h:67
virtual bool IFNodeToReq(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
Definition: vm.cc:206
virtual DBEntry * OperDBAdd(const DBRequest *req)
Definition: vm.cc:159
std::string GetString(const std::string &key) const
const boost::uuids::uuid & GetUuid() const
Definition: interface.h:113
DBTableBase * get_table() const
Definition: db_entry.cc:119
Definition: vm.h:14
boost::uuids::uuid GetVmUuid(const std::string &name)
Definition: vm.cc:144
bool IsDeleted() const
Definition: db_entry.h:49
ConfigManager * config_manager() const
Definition: agent.cc:889
void SetCfgName(std::string name)
Definition: vm.h:44
Definition: vm.h:32
Definition: vm.h:78
Agent * agent() const
Definition: agent_db.h:213
virtual ~VmEntry()
Definition: vm.cc:28
std::unique_ptr< DBRequestData > data
Definition: db_table.h:49
uint32_t GetRefCount() const
Definition: vm.h:48
virtual bool OperDBOnChange(DBEntry *entry, const DBRequest *req)
Definition: vm.cc:175
InterfaceTable * interface_table() const
Definition: agent.h:465
bool Enqueue(DBRequest *req)
Definition: db_table.cc:194
boost::uuids::uuid uuid
uint32_t max_vm_flows() const
Definition: agent.h:1205
static std::string UuidToString(const boost::uuids::uuid &id)
Definition: string_util.h:138
const boost::uuids::uuid & GetUuid() const
Definition: vm.h:46
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
virtual bool OperDBDelete(DBEntry *entry, const DBRequest *req)
Definition: vm.cc:181
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
Definition: vm.cc:238
static DBTableBase * CreateTable(DB *db, const std::string &name)
Definition: vm.cc:193
std::string name_
Definition: vm.h:28
virtual KeyPtr GetDBRequestKey() const
Definition: vm.cc:42
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
Definition: vm.cc:52
Definition: db.h:24
void Init()
Definition: db_table.cc:387
bool drop_new_flows() const
Definition: vm.h:65
uint8_t type
Definition: load_balance.h:109
virtual bool IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &u)
Definition: vm.cc:198
Definition: vm.h:21
tbb::atomic< int > flow_count_
Definition: vm.h:72
void AddVmNode(IFMapNode *node)
std::unique_ptr< DBRequestKey > key
Definition: db_table.h:48
tbb::mutex back_ref_mutex_
Definition: agent_db.h:60
DBOperation oper
Definition: db_table.h:42
bool drop_new_flows_
Definition: vm.h:74
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
Definition: agent_db.h:18
VmTable(DB *db, const std::string &name)
Definition: vm.h:80
boost::uuids::uuid uuid_
Definition: vm.h:70
vector< boost::uuids::uuid > SGUuidList
Definition: vm.h:22
const std::string & name() const
Definition: ifmap_node.h:48
IFMapObject * GetObject()
Definition: ifmap_node.cc:63
tbb::atomic< int > linklocal_flow_count_
Definition: vm.h:73
VmEntry(const boost::uuids::uuid &id)
Definition: vm.cc:22
VmNameUuidTree vm_name_uuid_tree_
Definition: vm.h:105
virtual bool IsLess(const DBEntry &rhs) const
Definition: vm.cc:33
boost::uuids::uuid uuid_
Definition: vm.h:18
uint32_t max_flows() const
static const int kDropNewFlowsRecoveryThreshold
Definition: agent.h:398
void SendObjectLog(AgentLogEvent::type event) const
Definition: vm.cc:115
bool ProcessConfig(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
Definition: vm.cc:219
void SetInterfacesDropNewFlows(bool drop_new_flows) const
Definition: vm.cc:94
virtual void SetKey(const DBRequestKey *key)
Definition: vm.cc:47