9 #include <boost/uuid/uuid.hpp>
10 #include <boost/filesystem.hpp>
11 #include <boost/foreach.hpp>
12 #include <rapidjson/document.h>
13 #include <rapidjson/prettywriter.h>
14 #include <rapidjson/stringbuffer.h>
28 #include "port_ipc/port_ipc_types.h"
31 using boost::uuids::nil_uuid;
32 namespace fs = boost::filesystem;
37 static bool GetStringMember(
const contrail_rapidjson::Value &d,
const char *member,
38 std::string *data, std::string *err) {
39 if (!d.HasMember(member) || !d[member].IsString()) {
41 *err +=
"Invalid or missing field for <" + string(member) +
">";
46 *data = d[member].GetString();
50 static bool GetUint32Member(
const contrail_rapidjson::Value &d,
const char *member,
51 uint32_t *data, std::string *err) {
52 if (!d.HasMember(member) || !d[member].IsInt()) {
54 *err +=
"Invalid or missing field for <" + string(member) +
">";
59 *data = d[member].GetInt();
63 static bool GetUuidMember(
const contrail_rapidjson::Value &d,
const char *member,
65 if (!d.HasMember(member) || !d[member].IsString()) {
67 *err +=
"Invalid or missing data for <" + string(member) +
">";
77 const string &name,
bool link_status) {
89 : agent_(agent), ports_dir_(dir), vmvn_dir_(dir +
"/vm"), version_(0),
100 if (fs::exists(ports_dir) ==
false) {
101 if (!fs::create_directories(ports_dir)) {
102 string err_msg =
"Creating directory " +
ports_dir_ +
" failed";
109 if (fs::exists(vmvn_dir) ==
false) {
110 if (!fs::create_directories(vmvn_dir)) {
111 string err_msg =
"Creating directory " +
vmvn_dir_ +
" failed";
122 fs::path ports_dir(dir);
123 fs::directory_iterator end_iter;
125 if (!fs::exists(ports_dir) || !fs::is_directory(ports_dir)) {
129 fs::directory_iterator it(ports_dir);
130 BOOST_FOREACH(fs::path
const &p, std::make_pair(it, end_iter)) {
131 if (!fs::is_regular_file(p)) {
135 if (!
IsUUID(p.filename().string())) {
148 fs::directory_iterator end_iter;
150 if (!fs::exists(vmvn_dir) || !fs::is_directory(vmvn_dir)) {
153 fs::directory_iterator it(vmvn_dir);
154 BOOST_FOREACH(fs::path
const &p, std::make_pair(it, end_iter)) {
155 if (!fs::is_directory(p)) {
165 std::ifstream f(file.c_str());
169 std::ostringstream tmp;
171 string json = tmp.str();
174 if (vm_vn_ports ==
false)
185 for (
size_t i = 0; i < d.Size(); i++) {
186 const contrail_rapidjson::Value& elem = d[i];
187 if (elem.IsObject() ==
false) {
188 err_msg =
"Json Array has invalid element ==> " + json;
206 string &err_msg,
bool write_file) {
207 contrail_rapidjson::Document d;
208 if (d.Parse<0>(const_cast<char *>(json.c_str())).HasParseError()) {
209 err_msg =
"Invalid Json string ==> " + json;
213 if (!d.IsObject() && !d.IsArray()) {
214 err_msg =
"Unexpected Json string ==> " + json;
225 for (
size_t i = 0; i < req_list.size(); i++) {
235 if (entry.get() == NULL) {
245 (
const contrail_rapidjson::Value &d,
bool check_port,
246 std::string &err_msg)
const {
253 if (
GetUuidMember(d,
"instance-id", &instance_uuid, &err_msg) ==
false) {
258 if (
GetUuidMember(d,
"vn-id", &vn_uuid, &err_msg) ==
false) {
263 if (
GetUuidMember(d,
"vm-project-id", &project_uuid, &err_msg) ==
false) {
276 boost::system::error_code ec;
277 Ip4Address ip4 = Ip4Address::from_string(ip4_str, ec);
283 boost::system::error_code ec6;
284 Ip6Address ip6 = Ip6Address::from_string(ip6_str, ec6);
292 uint32_t link_state = 1;
295 }
else if (val == 2) {
301 if (vn_uuid == nil_uuid()) {
302 err_msg =
"Invalid VN uuid";
314 err_msg =
"Interface does not exist in OS";
323 if (ValidateMac(mac) ==
false) {
324 err_msg =
"Invalid MAC, Use xx:xx:xx:xx:xx:xx format";
330 if (
GetUint32Member(d,
"rx-vlan-id", &rx_vlan_id, &err_msg) ==
false) {
335 if (
GetUint32Member(d,
"tx-vlan-id", &tx_vlan_id, &err_msg) ==
false) {
341 err_msg +=
"Invalid request. RX (isolated) vlan set, "
342 "but TX vlan not set";
348 uint32_t vhostuser_mode = 0;
358 ip4.to_string(), ifname, mac, vm_name, tx_vlan_id, rx_vlan_id,
361 ip6.to_string(), version_, vhostuser_mode, link_state);
363 instance_uuid, vm_name, vn_uuid, project_uuid,
364 ip4, ip6, mac, tx_vlan_id, rx_vlan_id,
365 vhostuser_mode, link_state);
369 const contrail_rapidjson::Value &d,
370 bool write_file,
string &err_msg)
const {
375 err_msg +=
"Writing of Json string to file failed for " +
396 fs::path file_path(filename);
401 remove = !fs::exists(file_path);
409 LOG(ERROR,
"Error producing entry JSON for port " << file_path.filename());
412 std::ofstream fs(filename.c_str());
414 LOG(ERROR,
"Cannot open file " << filename <<
" for writing");
417 bool output = (fs << info).good();
420 LOG(ERROR,
"Cannot write JSON to the file " << filename);
422 fs::remove(file_path);
435 while ((pos = mac.find(
':', pos)) != std::string::npos) {
450 if (vmi_uuid != nil_uuid()) {
462 if (entry.get() != NULL) {
463 version = entry->version();
469 fs::path file_path(file);
471 if (fs::exists(file_path) && fs::is_regular_file(file_path)) {
472 if (
remove(file.c_str())) {
473 err_msg =
"Error deleting file " + file;
480 if (u == nil_uuid()) {
481 err_msg =
"Port Not found " + url;
485 if (entry.get() == NULL) {
486 err_msg =
"Port Not found " + url;
490 err_msg =
"Incorrect Port type for " + url;
495 if (ventry == NULL) {
496 err_msg =
"Invalid Port " + url;
499 int written_to_file = 0;
504 err_msg +=
"Writing of Json to file failed on enable for " +
511 string msg =
"Enable state for " + url +
" version " +
520 if (u == nil_uuid()) {
521 err_msg =
"Port Not found " + url;
525 if (entry.get() == NULL) {
526 err_msg =
"Port Not found " + url;
530 err_msg =
"Incorrect Port type for " + url;
535 if (ventry == NULL) {
536 err_msg =
"Invalid Port " + url;
539 int written_to_file = 0;
544 err_msg +=
"Writing of Json to file failed on disable for " +
551 string msg =
"Disable state for " + url +
" version " +
560 if (vmi_uuid == nil_uuid()) {
567 contrail_rapidjson::Document *doc)
const {
568 contrail_rapidjson::Document::AllocatorType &a = doc->GetAllocator();
569 contrail_rapidjson::Value v;
570 contrail_rapidjson::Value vk;
571 doc->AddMember(vk.SetString(key, a), v.SetString(value, a), a);
575 bool meta_info)
const {
576 contrail_rapidjson::Document doc;
578 contrail_rapidjson::Document::AllocatorType &a = doc.GetAllocator();
583 AddMember(
"instance-id", str2.c_str(), &doc);
585 string str3 = entry->
ip4_addr().to_string();
586 AddMember(
"ip-address", str3.c_str(), &doc);
587 string str4 = entry->
ip6_addr().to_string();
588 AddMember(
"ip6-address", str4.c_str(), &doc);
592 AddMember(
"vm-project-id", str6.c_str(), &doc);
595 doc.AddMember(
"type", (
int)entry->
type(), a);
596 doc.AddMember(
"rx-vlan-id", (
int)entry->
rx_vlan_id(), a);
597 doc.AddMember(
"tx-vlan-id", (
int)entry->
tx_vlan_id(), a);
603 doc.AddMember(
"link-state", (
int)entry->
link_state(), a);
611 contrail_rapidjson::StringBuffer buffer;
612 contrail_rapidjson::PrettyWriter<contrail_rapidjson::StringBuffer> writer(buffer);
615 return buffer.GetString();
620 if (vmi_uuid == nil_uuid()) {
644 if (!d.HasMember(
"ip-address") || !d[
"ip-address"].IsString()) {
648 if (!d.HasMember(
"prefix-len") || !d[
"prefix-len"].IsInt()) {
651 boost::system::error_code ec;
652 entry->
ip_ = Ip4Address::from_string(d[
"ip-address"].GetString(), ec);
656 entry->
plen_ = d[
"prefix-len"].GetInt();
662 for (
size_t i = 0; i < d.Size(); i++) {
663 const contrail_rapidjson::Value& elem = d[i];
664 if (!elem.IsObject()) {
668 if (!BuildGatewayArrayElement(elem, &entry)) {
671 list->push_back(entry);
677 std::string &member_err,
679 if (!d.HasMember(
"interface") || !d[
"interface"].IsString()) {
680 member_err =
"interface";
684 if (!d.HasMember(
"routing-instance") || !d[
"routing-instance"].IsString()) {
685 member_err =
"routing-instance";
689 if (!d.HasMember(
"subnets") || !d[
"subnets"].IsArray()) {
690 member_err =
"subnets";
695 member_err =
"subnets value";
699 if (!d.HasMember(
"routes") || !d[
"routes"].IsArray()) {
700 member_err =
"routes";
705 member_err =
"routes value";
709 req->
vrf_name_ = d[
"routing-instance"].GetString();
715 const string &json,
string &err_msg,
719 err_msg =
"Json string does not have all required members, "
720 + member_err +
" is missing ==> "
729 contrail_rapidjson::Document d;
730 if (d.Parse<0>(const_cast<char *>(json.c_str())).HasParseError()) {
731 err_msg =
"Invalid Json string ==> " + json;
736 err_msg =
"Unexpected Json string (not an array) ==> " + json;
741 std::vector<VirtualGatewayInfo> req_list;
742 for (
size_t i = 0; i < d.Size(); i++) {
743 const contrail_rapidjson::Value& elem = d[i];
744 if (elem.IsObject()) {
749 req_list.push_back(req);
751 err_msg =
"Json Array has invalid element ==> " + json;
757 if (!req_list.empty()) {
758 boost::shared_ptr<VirtualGatewayData>
768 contrail_rapidjson::Document d;
769 if (d.Parse<0>(const_cast<char *>(json.c_str())).HasParseError()) {
770 err_msg =
"Invalid Json string ==> " + json;
775 err_msg =
"Unexpected Json string (not an array) ==> " + json;
780 std::vector<VirtualGatewayInfo> req_list;
781 for (
size_t i = 0; i < d.Size(); i++) {
782 const contrail_rapidjson::Value& elem = d[i];
783 if (elem.IsObject()) {
784 if (!elem.HasMember(
"interface") || !elem[
"interface"].IsString()) {
785 err_msg =
"Json string does not have or has invalid value for "
786 "member interface ==> " + json;
791 req_list.push_back(req);
793 err_msg =
"Json Array has invalid element ==> " + json;
799 if (!req_list.empty()) {
800 boost::shared_ptr<VirtualGatewayData>
813 string &err_msg,
bool write_file) {
814 contrail_rapidjson::Document d;
815 if (d.Parse<0>(const_cast<char *>(json.c_str())).HasParseError()) {
816 err_msg =
"Invalid Json string ==> " + json;
822 err_msg =
"Unexpected Json string ==> " + json;
828 err_msg =
"Arrays not supported in json for vm ==> " + json;
834 if (entry.get() == NULL) {
844 const contrail_rapidjson::Value &d,
845 bool write_file,
string &err_msg)
const {
850 err_msg +=
"Writing of Json string to file failed for Vm " +
866 (
const contrail_rapidjson::Value &d,
bool check_port,
867 std::string &err_msg)
const {
870 if (
GetUuidMember(d,
"vm-uuid", &vm_uuid, &err_msg) ==
false) {
875 if (
GetStringMember(d,
"host-ifname", &host_ifname, &err_msg) ==
false) {
881 err_msg =
"Interface does not exist in OS";
891 string vm_identifier;
901 if (
GetUuidMember(d,
"vn-uuid", &vn_uuid, &err_msg) ==
false) {
906 if (
GetUuidMember(d,
"vmi-uuid", &vmi_uuid, &err_msg) ==
false) {
912 vm_name, vm_identifier, host_ifname, vm_ifname,
913 vm_namespace, version_);
916 vn_uuid, vmi_uuid, vm_name, vm_identifier,
917 vm_ifname, vm_namespace);
921 string &info,
bool meta_info)
const {
922 contrail_rapidjson::Document doc;
926 AddMember(
"vm-uuid", str2.c_str(), &doc);
928 AddMember(
"vn-uuid", str2.c_str(), &doc);
930 AddMember(
"vmi-uuid", str2.c_str(), &doc);
943 contrail_rapidjson::StringBuffer buffer;
944 contrail_rapidjson::PrettyWriter<contrail_rapidjson::StringBuffer> writer(buffer);
946 info = buffer.GetString();
952 fs::path base_dir(vmvn_dir);
953 if (fs::exists(base_dir) ==
false) {
954 if (!fs::create_directories(base_dir)) {
955 string err_msg =
"Creating directory " + vmvn_dir +
" failed";
962 fs::path file_path(filename);
964 if (fs::exists(file_path)) {
971 LOG(ERROR,
"Error producing entry JSON for VM " << entry->
vm_name());
974 std::ofstream fs(filename.c_str());
976 LOG(ERROR,
"Cannot open file " << filename <<
" for writing");
979 bool output = (fs << info).good();
982 LOG(ERROR,
"Cannot write JSON to the file " << filename);
983 fs::remove(file_path);
994 std::set<boost::uuids::uuid> vmi_uuid_set;
999 std::set<boost::uuids::uuid>::iterator it = vmi_uuid_set.begin();
1000 while (it != vmi_uuid_set.end()) {
1007 if (entry.get() != NULL) {
1008 version = entry->version();
1019 fs::path file_path(file);
1020 if (fs::exists(file_path) && fs::is_regular_file(file_path)) {
1021 if (
remove(file.c_str())) {
1022 err_msg +=
" Error deleting file " + file;
1033 fs::path base_dir(vmvn_dir);
1034 if (!fs::remove_all(base_dir)) {
1035 string err_msg =
"Deleting directory " + vmvn_dir +
" failed";
1045 if (vm_uuid == nil_uuid()) {
1056 if (vm_uuid == nil_uuid()) {
1060 std::set<boost::uuids::uuid> vmi_uuid_set;
1064 std::set<boost::uuids::uuid>::iterator it = vmi_uuid_set.begin();
1072 }
while (it != vmi_uuid_set.end());
1073 info.erase(info.size() - 1);
1081 string &resp)
const {
1085 if (vmi_entry == NULL) {
1086 resp =
"Interface Entry not found for request. Retry";
1092 resp =
"VirtualNetwork not found for request. Retry";
1096 contrail_rapidjson::Document doc;
1098 contrail_rapidjson::Document::AllocatorType &a = doc.GetAllocator();
1104 AddMember(
"vm-uuid", str2.c_str(), &doc);
1111 doc.AddMember(
"sub-interface", (
bool)vmi_entry->
sub_interface_, a);
1112 doc.AddMember(
"vlan-id", (
int)vmi_entry->
vlan_tag_, a);
1114 if (vmi_entry->
vmi_cfg != NULL) {
1115 const std::vector<autogen::KeyValuePair> annotations =
1116 vmi_entry->
vmi_cfg->annotations();
1117 if (annotations.size()) {
1119 contrail_rapidjson::Value val(contrail_rapidjson::kStringType);
1120 contrail_rapidjson::Value array(contrail_rapidjson::kArrayType);
1121 std::vector<autogen::KeyValuePair>::const_iterator it =
1122 annotations.begin();
1123 while (it != annotations.end()) {
1124 str6 =
"{" + it->key +
":" + it->value +
"}";
1125 val.SetString(str6.c_str(), a);
1126 array.PushBack(val, a);
1129 doc.AddMember(
"annotations", array, a);
1133 contrail_rapidjson::StringBuffer buffer;
1134 contrail_rapidjson::PrettyWriter<contrail_rapidjson::StringBuffer>
1137 resp += buffer.GetString();
1142 string &info)
const {
1144 if (vm_uuid == nil_uuid()) {
1148 if (vmi.size() > 0) {
1157 std::set<boost::uuids::uuid> vmi_uuid_set;
1161 std::set<boost::uuids::uuid>::iterator it = vmi_uuid_set.begin();
1169 }
while (it != vmi_uuid_set.end());
1170 info.erase(info.size() - 1);
1181 resp =
"Interface not found for request. Retry";
1187 resp =
"VirtualMachine not found for request. Retry";
1193 resp =
"VirtualNetwork not found for request. Retry";
1199 if ((ipam_v4 == NULL) && (ipam_v6 == NULL)) {
1200 resp =
"Missing IPAM entry for request. Retry";
1204 contrail_rapidjson::Document doc;
1206 contrail_rapidjson::Document::AllocatorType &a = doc.GetAllocator();
1212 AddMember(
"instance-id", str2.c_str(), &doc);
1218 AddMember(
"vm-project-id", str4.c_str(), &doc);
1221 AddMember(
"mac-address", str5.c_str(), &doc);
1223 doc.AddMember(
"rx-vlan-id", (
int)vmi->
rx_vlan_id(), a);
1224 doc.AddMember(
"tx-vlan-id", (
int)vmi->
tx_vlan_id(), a);
1229 AddMember(
"ip-address", str6.c_str(), &doc);
1230 doc.AddMember(
"plen", ipam_v4->
plen, a);
1231 string str7 = ipam_v4->
dns_server.to_v4().to_string();
1232 AddMember(
"dns-server", str7.c_str(), &doc);
1233 string str8 = ipam_v4->
default_gw.to_v4().to_string();
1234 AddMember(
"gateway", str8.c_str(), &doc);
1239 AddMember(
"v6-ip-address", str6.c_str(), &doc);
1240 string str7 = ipam_v6->
dns_server.to_v6().to_string();
1241 AddMember(
"v6-dns-server", str7.c_str(), &doc);
1242 string str8 = ipam_v6->
default_gw.to_v6().to_string();
1243 AddMember(
"v6-gateway", str8.c_str(), &doc);
1250 contrail_rapidjson::StringBuffer buffer;
1251 contrail_rapidjson::PrettyWriter<contrail_rapidjson::StringBuffer> writer(buffer);
1253 resp += buffer.GetString();
virtual const boost::uuids::uuid & vm_uuid() const
bool MakeJsonFromVmiConfig(const boost::uuids::uuid &vmi_uuid, string &resp) const
#define CONFIG_TRACE(obj,...)
static bool GetUint32Member(const contrail_rapidjson::Value &d, const char *member, uint32_t *data, std::string *err)
void AddMember(const char *key, const char *value, contrail_rapidjson::Document *doc) const
const MacAddress & vm_mac() const
static bool GetStringMember(const contrail_rapidjson::Value &d, const char *member, std::string *data, std::string *err)
static boost::uuids::uuid StringToUuid(const std::string &str)
void Enqueue(boost::shared_ptr< VirtualGatewayData > request)
bool ValidateMac(const std::string &mac) const
bool DeletePort(const string &url, string &err_msg)
const std::string & vm_identifier() const
const boost::uuids::uuid & vm_project_uuid() const
bool WriteJsonToFile(VmiSubscribeEntry *entry, bool overwrite) const
const boost::uuids::uuid & vm_uuid() const
uint16_t rx_vlan_id() const
bool GetVmVnCfgPort(const string &vm, string &info) const
const boost::uuids::uuid & GetUuid() const
uint32_t stale_interface_cleanup_timeout() const
const VnIpam * GetIpam(const IpAddress &ip) const
bool GetPortInfo(const std::string &uuid_str, std::string &info) const
boost::uuids::uuid GetVmUuid(const std::string &name)
bool DelVgwFromJson(const std::string &json, std::string &err_msg) const
PortIpcHandler(Agent *agent, const std::string &dir)
const boost::uuids::uuid & project_uuid() const
bool GetVmVnPort(const std::string &vm_uuid, const std::string &vmi_uuid, std::string &info) const
boost::scoped_ptr< InterfaceConfigStaleCleaner > interface_stale_cleaner_
bool MakeJsonFromVmi(const boost::uuids::uuid &vmi_uuid, std::string &resp) const
std::unique_ptr< DBRequestData > data
void ProcessFile(const std::string &file, bool check_port, bool vm_vn_port)
bool AddPortArrayFromJson(const contrail_rapidjson::Value &d, const std::string &json, VmiSubscribeEntryPtrList &req_list, bool check_port, std::string &err_msg)
bool AddVmiUuidEntry(PortSubscribeEntryPtr entry, const contrail_rapidjson::Value &d, bool write_file, std::string &err_msg) const
uint8_t vhostuser_mode() const
const boost::uuids::uuid & vmi_uuid() const
static bool InterfaceExists(std::string if_name)
InterfaceTable * interface_table() const
bool Enqueue(DBRequest *req)
VirtualGatewayConfig::SubnetList routes_
VnTable * vn_table() const
static std::string UuidToString(const boost::uuids::uuid &id)
bool EnablePort(const string &url, string &err_msg)
const boost::uuids::uuid & GetUuid() const
std::string MakeVmiUuidJson(const VmiSubscribeEntry *entry, bool meta_info) const
uint16_t rx_vlan_id() const
bool AddVmVnPort(const std::string &json, bool check_port, std::string &err_msg, bool write_file)
uint8_t vhostuser_mode() const
std::string ToString() const
bool DeleteVmVnPort(const boost::uuids::uuid &vmi_uuid, string &err_msg)
InterfaceConstRef FindVmi(const boost::uuids::uuid &u)
void MakeVmVnPortJson(const VmVnPortSubscribeEntry *entry, string &info, bool meta_info) const
uint16_t tx_vlan_id() const
const std::string & program_name() const
std::vector< PortSubscribeEntryPtr > VmiSubscribeEntryPtrList
boost::uuids::uuid vn_uuid_
static const char * TypeToString(Type type)
static const std::string integerToString(const NumberType &num)
const std::string & vm_ifname() const
const std::string & mac_addr() const
static const uint32_t kInvalidVlanId
bool DisablePort(const string &url, string &err_msg)
VmVnPortSubscribeEntry * MakeAddVmVnPortRequest(const contrail_rapidjson::Value &d, bool check_port, std::string &err_msg) const
boost::asio::ip::address_v6 Ip6Address
bool AddVmVnPortEntry(PortSubscribeEntryPtr entry, const contrail_rapidjson::Value &d, bool write_file, std::string &err_msg) const
std::unique_ptr< DBRequestKey > key
static const std::string duration_usecs_to_string(const uint64_t usecs)
boost::uuids::uuid vm_uuid_
const std::string & vm_name() const
const std::string & ifname() const
boost::intrusive_ptr< const Interface > InterfaceConstRef
const VnEntry * vn() const
boost::shared_ptr< PortSubscribeEntry > PortSubscribeEntryPtr
AgentParam * params() const
VnEntry * Find(const boost::uuids::uuid &vn_uuid)
std::unique_ptr< PortSubscribeTable > port_subscribe_table_
boost::asio::ip::address_v4 Ip4Address
const boost::uuids::uuid & vn_uuid() const
const Ip4Address & primary_ip_addr() const
static void InterfaceResync(Agent *agent, const boost::uuids::uuid &u, const string &name, bool link_status)
const std::string & vm_namespace() const
const std::string & vm_name() const
autogen::VirtualMachineInterface * vmi_cfg
static bool GetUuidMember(const contrail_rapidjson::Value &d, const char *member, boost::uuids::uuid *u, std::string *err)
static uint64_t UTCTimestampUsec()
virtual const boost::uuids::uuid & vn_uuid() const
const Ip6Address & primary_ip6_addr() const
void set_link_state(uint8_t value)
const boost::uuids::uuid & vmi_uuid() const
uint8_t link_state() const
#define LOG(_Level, _Msg)
virtual ~PortIpcHandler()
void DeleteVmiUuidEntry(const boost::uuids::uuid &u, std::string &err_str)
const std::string & name() const
std::vector< Subnet > SubnetList
const boost::uuids::uuid & GetUuid() const
bool BuildGatewayArrayElement(const contrail_rapidjson::Value &d, VirtualGatewayConfig::Subnet *entry) const
const string & GetName() const
bool AddPortFromJson(const string &json, bool check_port, string &err_msg, bool write_file)
static MacAddress FromString(const std::string &str, boost::system::error_code *error=NULL)
const Ip6Address & ip6_addr() const
uint16_t tx_vlan_id() const
bool BuildGateway(const contrail_rapidjson::Value &d, const std::string &json, std::string &err_msg, VirtualGatewayInfo *req) const
VirtualGatewayConfig::SubnetList subnets_
bool ValidGatewayJsonString(const contrail_rapidjson::Value &d, VirtualGatewayConfig::SubnetList *list) const
VirtualGatewayConfigTable * vgw_config_table() const
const Ip4Address & ip4_addr() const
bool IsUUID(const std::string &uuid_str) const
virtual bool OnInterfaceConfigStaleTimeout(int32_t version)
void ReloadAllPorts(const std::string &dir, bool check_port, bool vm_vn_port)
VmTable * vm_table() const
const VmEntry * vm() const
bool HasAllGatewayFields(const contrail_rapidjson::Value &d, std::string &member_err, VirtualGatewayInfo *req) const
bool AddVgwFromJson(const std::string &json, std::string &err_msg) const
std::string interface_name_
VmiSubscribeEntry * MakeAddVmiUuidRequest(const contrail_rapidjson::Value &d, bool check_port, std::string &err_msg) const