OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
port_subscribe_table.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef _VNSW_AGENT_PORT_IPC_PORT_SUBSCRIBE_TABLE_H_
6 #define _VNSW_AGENT_PORT_IPC_PORT_SUBSCRIBE_TABLE_H_
7 
8 #include <map>
9 #include <memory>
10 #include <vector>
11 #include <string>
12 #include <string>
13 #include <boost/uuid/uuid.hpp>
14 #include <boost/shared_ptr.hpp>
15 
16 #include <base/util.h>
17 #include <base/address.h>
18 #include <tbb/mutex.h>
19 #include <db/db_table.h>
20 #include <db/db_entry.h>
21 #include <vnc_cfg_types.h>
22 
23 class InterfaceTable;
24 class Agent;
26 class VmiSubscribeEntry;
28 class PortSubscribeEntry;
30 typedef boost::shared_ptr<PortSubscribeEntry> PortSubscribeEntryPtr;
31 
32 /****************************************************************************
33  * The class is responsible to manage port subscribe/unsubscribe from IPC
34  * channels.
35  ****************************************************************************/
37 public:
38  enum Type {
42  };
43 
44  PortSubscribeEntry(Type type, const std::string &ifname, int32_t version);
45  virtual ~PortSubscribeEntry();
46 
47  virtual void OnAdd(Agent *agent, PortSubscribeTable *table) const = 0;
48  virtual void OnDelete(Agent *agent, PortSubscribeTable *table) const = 0;
49  virtual void Update(const PortSubscribeEntry *rhs);
50 
51  static const char *TypeToString(Type type);
52  Type type() const { return type_; }
53  const std::string &ifname() const { return ifname_; }
54  uint32_t version() const { return version_; }
55 
56  virtual bool MatchVn(const boost::uuids::uuid &u) const = 0;
57  virtual const boost::uuids::uuid &vn_uuid() const = 0;
58  virtual bool MatchVm(const boost::uuids::uuid &u) const = 0;
59  virtual const boost::uuids::uuid &vm_uuid() const = 0;
60 
61 protected:
63  std::string ifname_;
64  uint16_t version_;
66 };
67 
69 public:
71  uint32_t version, const boost::uuids::uuid &vmi_uuid,
73  const std::string &vm_name,
76  const Ip4Address &ip4_addr, const Ip6Address &ip6_addr,
77  const std::string &mac_addr, uint16_t tx_vlan_id,
78  uint16_t rx_vlan_id,
79  uint8_t vhostuser_mode, uint8_t link_state);
81 
82  virtual bool MatchVn(const boost::uuids::uuid &u) const;
83  virtual bool MatchVm(const boost::uuids::uuid &u) const;
84 
85  virtual void Update(const PortSubscribeEntry *rhs);
86  void OnAdd(Agent *agent, PortSubscribeTable *table) const;
87  void OnDelete(Agent *agent, PortSubscribeTable *table) const;
88 
89  const boost::uuids::uuid &vmi_uuid() const { return vmi_uuid_; }
90  const boost::uuids::uuid &vm_uuid() const { return vm_uuid_; }
91  const std::string &vm_name() const { return vm_name_; }
92  const boost::uuids::uuid &vn_uuid() const { return vn_uuid_; }
93  const boost::uuids::uuid &project_uuid() const { return project_uuid_; }
94  const Ip4Address &ip4_addr() const { return ip4_addr_; }
95  const Ip6Address &ip6_addr() const { return ip6_addr_; }
96  const std::string &mac_addr() const { return mac_addr_; }
97  uint16_t tx_vlan_id() const { return tx_vlan_id_; }
98  uint16_t rx_vlan_id() const { return rx_vlan_id_; }
99  uint8_t vhostuser_mode() const { return vhostuser_mode_; }
100  uint8_t link_state() const { return link_state_; }
101  void set_link_state(uint8_t value) { link_state_ = value; }
102 private:
105  std::string vm_name_;
110  std::string mac_addr_;
111  uint16_t tx_vlan_id_;
112  uint16_t rx_vlan_id_;
114  uint8_t link_state_;
116 };
117 
118 /****************************************************************************
119  * In case of container orchestrators like k8s/mesos, we do not get VMI UUID
120  * in port-subscribe message. Instead, the interface is addressed by
121  * vm-uuid and vn. The VmVnPortSubscribeEntry class is used for these
122  * scenarios
123  ****************************************************************************/
125 public:
127  const std::string &ifname, uint32_t version,
131  const std::string &vm_name,
132  const std::string &vm_identifier,
133  const std::string &vm_ifname,
134  const std::string &vm_namespace);
136 
137  virtual bool MatchVn(const boost::uuids::uuid &u) const;
138  virtual const boost::uuids::uuid &vn_uuid() const { return vn_uuid_; }
139  virtual bool MatchVm(const boost::uuids::uuid &u) const;
140  virtual const boost::uuids::uuid &vm_uuid() const { return vm_uuid_; }
141 
142  virtual void Update(const PortSubscribeEntry *rhs);
143  void OnAdd(Agent *agent, PortSubscribeTable *table) const;
144  void OnDelete(Agent *agent, PortSubscribeTable *table) const;
145 
146  const std::string &vm_name() const { return vm_name_; }
147  const std::string &vm_identifier() const { return vm_identifier_; }
148  const std::string &vm_ifname() const { return vm_ifname_; }
149  const std::string &vm_namespace() const { return vm_namespace_; }
150  void set_vmi_uuid(const boost::uuids::uuid &u) { vmi_uuid_ = u; }
151  const boost::uuids::uuid &vmi_uuid() const { return vmi_uuid_; }
152 private:
155  std::string vm_name_;
156  std::string vm_identifier_;
157  std::string vm_ifname_;
158  std::string vm_namespace_;
161 };
162 
164 public:
165  PortSubscribeTable(Agent *agent);
166  virtual ~PortSubscribeTable();
167 
168  struct State : DBState {
169  State() : uuid_() { }
170  ~State() { }
171 
173  };
174 
175  struct Cmp {
177  const boost::uuids::uuid &rhs) const {
178  return lhs < rhs;
179  }
180  };
181  typedef std::map<boost::uuids::uuid, PortSubscribeEntryPtr, Cmp> VmiTree;
182  typedef std::map<boost::uuids::uuid, IFMapNode *> UuidToIFNodeTree;
183 
184  // trees used for managing vm-vn port subscriptions
185  // VmiToVmVnTree : The tree from vmi-uuid to corresponding
186  // vm+vn uuid
187  // VmVnToVmiTree : Reverse mapping for VmiToVmVnTree. Will be used
188  // to find VMI when port-subscription message
189  // Both the tree are built from VmInterfaceConfigData
190 
191  struct VmVnUuidEntry {
195 
197  const boost::uuids::uuid &vn_uuid,
198  const boost::uuids::uuid &vmi_uuid) :
199  vm_uuid_(vm_uuid), vn_uuid_(vn_uuid), vmi_uuid_(vmi_uuid) {
200  }
202  vm_uuid_(boost::uuids::nil_uuid()),
203  vn_uuid_(boost::uuids::nil_uuid()),
204  vmi_uuid_(boost::uuids::nil_uuid()) {
205  }
206  virtual ~VmVnUuidEntry() { }
207  };
208 
210  bool operator()(const VmVnUuidEntry &lhs,
211  const VmVnUuidEntry &rhs) const {
212  if (lhs.vm_uuid_ != rhs.vm_uuid_) {
213  return lhs.vm_uuid_ < rhs.vm_uuid_;
214  }
215  if (lhs.vn_uuid_ != rhs.vn_uuid_) {
216  return lhs.vn_uuid_ < rhs.vn_uuid_;
217  }
218  return lhs.vmi_uuid_ < rhs.vmi_uuid_;
219  }
220  };
221 
222  struct VmiEntry {
227  uint16_t vlan_tag_;
228  std::string mac_;
230  autogen::VirtualMachineInterface *vmi_cfg;
231 
234  vlan_tag_(), mac_(), vhostuser_mode_() {
235  vmi_cfg = NULL;
236  }
237  };
238 
239  typedef std::map<boost::uuids::uuid, VmiEntry> VmiToVmVnTree;
240  typedef std::map<VmVnUuidEntry, boost::uuids::uuid, VmVnUuidEntryCmp>
242  typedef std::map<VmVnUuidEntry, PortSubscribeEntryPtr, VmVnUuidEntryCmp>
244 
245  void InitDone();
246  void Shutdown();
247  IFMapNode *UuidToIFNode(const boost::uuids::uuid &u) const;
248  void Notify(DBTablePartBase *partition, DBEntryBase *e);
249  void StaleWalk(uint64_t version);
250  uint32_t Size() const { return vmi_tree_.size(); }
251 
252  void AddVmi(const boost::uuids::uuid &u, PortSubscribeEntryPtr entry);
253  void DeleteVmi(const boost::uuids::uuid &u);
255 
256  void AddVmVnPort(const boost::uuids::uuid &vm_uuid,
257  const boost::uuids::uuid &vn_uuid,
258  const boost::uuids::uuid &vmi_uuid,
259  PortSubscribeEntryPtr entry);
260  void DeleteVmVnPort(const boost::uuids::uuid &vm_uuid,
261  const boost::uuids::uuid &vn_uuid,
262  const boost::uuids::uuid &vmi_uuid);
264  const boost::uuids::uuid &vn_uuid,
265  const boost::uuids::uuid &vmi_uuid);
267  const boost::uuids::uuid &vn_uuid,
268  const boost::uuids::uuid &vmi_uuid);
269 
270  void HandleVmiIfnodeAdd(const boost::uuids::uuid &vmi_uuid,
271  const VmInterfaceConfigData *data);
272  void HandleVmiIfnodeDelete(const boost::uuids::uuid &vmi_uuid);
273 
275  const boost::uuids::uuid &vm_uuid,
276  const boost::uuids::uuid &vn_uuid) const;
277 
278  bool VmVnToVmiSetNoLock(const boost::uuids::uuid &vm_uuid,
279  std::set<boost::uuids::uuid> &vmi_uuid_set) const;
280  bool VmVnToVmiSet(const boost::uuids::uuid &vm_uuid,
281  std::set<boost::uuids::uuid> &vmi_uuid_set) const;
282  const VmiEntry *VmiToEntry(const boost::uuids::uuid &vmi_uuid) const;
283 
284 private:
285  void UpdateVmiIfnodeInfo(const boost::uuids::uuid &vmi_uuid,
286  const VmInterfaceConfigData *data);
287  void DeleteVmiIfnodeInfo(const boost::uuids::uuid &vmi_uuid);
288 private:
291  friend class SandeshVmiToVmVnTask;
292  friend class SandeshVmVnToVmiTask;
293 
297  mutable tbb::mutex mutex_;
306 };
307 
308 #endif // _VNSW_AGENT_PORT_IPC_PORT_SUBSCRIBE_TABLE_H_
virtual const boost::uuids::uuid & vm_uuid() const
bool operator()(const VmVnUuidEntry &lhs, const VmVnUuidEntry &rhs) const
VmVnToVmiTree vmvn_to_vmi_tree_
boost::uuids::uuid vm_uuid_
const std::string & vm_identifier() const
bool VmVnToVmiSet(const boost::uuids::uuid &vm_uuid, std::set< boost::uuids::uuid > &vmi_uuid_set) const
void OnAdd(Agent *agent, PortSubscribeTable *table) const
const boost::uuids::uuid & vm_uuid() const
void OnDelete(Agent *agent, PortSubscribeTable *table) const
VNController * controller_
virtual bool MatchVn(const boost::uuids::uuid &u) const
void DeleteVmVnPort(const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid)
void set_vmi_uuid(const boost::uuids::uuid &u)
DISALLOW_COPY_AND_ASSIGN(VmiSubscribeEntry)
void OnDelete(Agent *agent, PortSubscribeTable *table) const
boost::uuids::uuid vn_uuid_
DBTableBase::ListenerId vmi_config_listener_id_
const boost::uuids::uuid & project_uuid() const
virtual const boost::uuids::uuid & vm_uuid() const =0
void DeleteVmi(const boost::uuids::uuid &u)
boost::uuids::uuid vmi_uuid_
int ListenerId
Definition: db_table.h:62
VmiToVmVnTree vmi_to_vmvn_tree_
uint8_t vhostuser_mode() const
virtual void OnDelete(Agent *agent, PortSubscribeTable *table) const =0
const boost::uuids::uuid & vmi_uuid() const
bool VmVnToVmiSetNoLock(const boost::uuids::uuid &vm_uuid, std::set< boost::uuids::uuid > &vmi_uuid_set) const
boost::uuids::uuid uuid
PortSubscribeTable(Agent *agent)
void AddVmVnPort(const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid, PortSubscribeEntryPtr entry)
void OnAdd(Agent *agent, PortSubscribeTable *table) const
virtual const boost::uuids::uuid & vn_uuid() const =0
virtual bool MatchVn(const boost::uuids::uuid &u) const =0
uint16_t rx_vlan_id() const
DISALLOW_COPY_AND_ASSIGN(VmVnPortSubscribeEntry)
DISALLOW_COPY_AND_ASSIGN(PortSubscribeEntry)
IFMapNode * UuidToIFNode(const boost::uuids::uuid &u) const
std::map< boost::uuids::uuid, IFMapNode * > UuidToIFNodeTree
void AddVmi(const boost::uuids::uuid &u, PortSubscribeEntryPtr entry)
static const char * TypeToString(Type type)
virtual bool MatchVm(const boost::uuids::uuid &u) const
PortSubscribeEntryPtr GetVmVnPort(const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid)
const std::string & vm_ifname() const
const std::string & mac_addr() const
void UpdateVmiIfnodeInfo(const boost::uuids::uuid &vmi_uuid, const VmInterfaceConfigData *data)
Definition: agent.h:358
UuidToIFNodeTree uuid_ifnode_tree_
std::map< VmVnUuidEntry, boost::uuids::uuid, VmVnUuidEntryCmp > VmVnToVmiTree
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
bool operator()(const boost::uuids::uuid &lhs, const boost::uuids::uuid &rhs) const
VmiSubscribeEntry(PortSubscribeEntry::Type type, const std::string &ifname, uint32_t version, const boost::uuids::uuid &vmi_uuid, const boost::uuids::uuid vm_uuid, const std::string &vm_name, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &project_uuid, const Ip4Address &ip4_addr, const Ip6Address &ip6_addr, const std::string &mac_addr, uint16_t tx_vlan_id, uint16_t rx_vlan_id, uint8_t vhostuser_mode, uint8_t link_state)
virtual bool MatchVn(const boost::uuids::uuid &u) const
const std::string & vm_name() const
const std::string & ifname() const
PortSubscribeEntryPtr Get(const boost::uuids::uuid &vmi_uuid, const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid) const
DISALLOW_COPY_AND_ASSIGN(PortSubscribeTable)
boost::shared_ptr< PortSubscribeEntry > PortSubscribeEntryPtr
virtual void OnAdd(Agent *agent, PortSubscribeTable *table) const =0
virtual bool MatchVm(const boost::uuids::uuid &u) const =0
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
const boost::uuids::uuid & vn_uuid() const
boost::uuids::uuid vm_uuid_
virtual void Update(const PortSubscribeEntry *rhs)
const std::string & vm_namespace() const
const std::string & vm_name() const
autogen::VirtualMachineInterface * vmi_cfg
void HandleVmiIfnodeDelete(const boost::uuids::uuid &vmi_uuid)
virtual const boost::uuids::uuid & vn_uuid() const
void HandleVmiIfnodeAdd(const boost::uuids::uuid &vmi_uuid, const VmInterfaceConfigData *data)
void set_link_state(uint8_t value)
boost::uuids::uuid vmi_uuid_
void DeleteVmiIfnodeInfo(const boost::uuids::uuid &vmi_uuid)
uint32_t version() const
const boost::uuids::uuid & vmi_uuid() const
void StaleWalk(uint64_t version)
uint8_t link_state() const
const VmiEntry * VmiToEntry(const boost::uuids::uuid &vmi_uuid) const
PortSubscribeEntry(Type type, const std::string &ifname, int32_t version)
virtual void Update(const PortSubscribeEntry *rhs)
VmVnUuidEntry(const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid)
std::map< boost::uuids::uuid, VmiEntry > VmiToVmVnTree
boost::uuids::uuid project_uuid_
boost::uuids::uuid vn_uuid_
PortSubscribeEntryPtr GetVmi(const boost::uuids::uuid &u) const
PortSubscribeEntryPtr GetVmVnPortNoLock(const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid)
InterfaceTable * interface_table_
virtual void Update(const PortSubscribeEntry *rhs)
IFMapAgentTable * vmi_config_table_
const Ip6Address & ip6_addr() const
uint16_t tx_vlan_id() const
std::map< VmVnUuidEntry, PortSubscribeEntryPtr, VmVnUuidEntryCmp > VmVnTree
uint32_t Size() const
const Ip4Address & ip4_addr() const
VmVnPortSubscribeEntry(PortSubscribeEntry::Type type, const std::string &ifname, uint32_t version, const boost::uuids::uuid &vm_uuid, const boost::uuids::uuid &vn_uuid, const boost::uuids::uuid &vmi_uuid, const std::string &vm_name, const std::string &vm_identifier, const std::string &vm_ifname, const std::string &vm_namespace)
std::map< boost::uuids::uuid, PortSubscribeEntryPtr, Cmp > VmiTree
virtual bool MatchVm(const boost::uuids::uuid &u) const
void Notify(DBTablePartBase *partition, DBEntryBase *e)