9 #include "schema/vnc_cfg_types.h"
17 #include <oper/agent_types.h>
84 CfgUuidSet(
id.uuid.uuid_mslong,
id.uuid.uuid_lslong, uuid);
89 return (strcmp(node->
table()->
Typename(), node_typename) == 0);
102 iter != si_node->
end(graph); ++iter) {
105 autogen::VirtualMachine *vm =
106 static_cast<autogen::VirtualMachine *
>(adj->
GetObject());
116 iter != vn_ipam_node->
end(graph); ++iter) {
131 iter != vmi_node->
end(graph); ++iter) {
143 iter != vmi_node->
end(graph); ++iter) {
146 autogen::InstanceIp *ip =
147 static_cast<autogen::InstanceIp *
>(adj->
GetObject());
148 return ip->address();
151 return std::string();
155 const std::string &ip) {
156 typedef boost::asio::ip::address_v4 Ipv4Address;
157 std::string prefix = subnet.subnet.ip_prefix;
158 int prefix_len = subnet.subnet.ip_prefix_len;
160 boost::system::error_code ec;
161 Ipv4Address ipv4 = Ipv4Address::from_string(ip, ec);
162 Ipv4Address ipv4_prefix = Ipv4Address::from_string(prefix, ec);
163 unsigned long mask = (0xFFFFFFFF << (32 - prefix_len)) & 0xFFFFFFFF;
165 if ((ipv4.to_ulong() & mask) == (ipv4_prefix.to_ulong() & mask)) {
173 autogen::ServiceInstance *svc_instance,
186 iter != vm_node->
end(graph); ++iter) {
188 if (!
IsNodeType(adj,
"virtual-machine-interface")) {
191 autogen::VirtualMachineInterface *vmi =
192 static_cast<autogen::VirtualMachineInterface *
>(
195 const autogen::VirtualMachineInterfacePropertiesType &vmi_props =
199 if (vn_node == NULL) {
204 if(vmi_props.service_interface_type ==
"left") {
206 if (vmi->mac_addresses().size())
210 else if(vmi_props.service_interface_type ==
"right") {
212 if (vmi->mac_addresses().size())
216 else if(vmi_props.service_interface_type ==
"management") {
218 if (vmi->mac_addresses().size())
224 iter != vn_node->
end(graph); ++iter) {
226 static_cast<IFMapNode *
>(iter.operator->());
227 if (!
IsNodeType(vn_ipam_node,
"virtual-network-network-ipam")) {
230 autogen::VirtualNetworkNetworkIpam *ipam =
231 static_cast<autogen::VirtualNetworkNetworkIpam *
>
234 if (ipam_node == NULL) {
237 autogen::NetworkIpam *network_ipam =
238 static_cast<autogen::NetworkIpam *
>(ipam_node->
GetObject());
239 const std::string subnet_method =
240 boost::to_lower_copy(network_ipam->ipam_subnet_method());
241 const std::vector<autogen::IpamSubnetType> &subnets =
242 (subnet_method ==
"flat-subnet") ?
243 network_ipam->ipam_subnets() : ipam->data().ipam_subnets;
244 for (
unsigned int i = 0; i < subnets.size(); ++i) {
245 int prefix_len = subnets[i].subnet.ip_prefix_len;
247 if (vmi_props.service_interface_type ==
"left") {
252 properties->
gw_ip = subnets[i].default_gateway;
254 }
else if (vmi_props.service_interface_type ==
"right") {
259 properties->
gw_ip = subnets[i].default_gateway;
261 }
else if (vmi_props.service_interface_type ==
"management") {
280 iter != si_node->
end(graph); ++iter) {
288 if (st_node == NULL) {
292 autogen::ServiceTemplate *svc_template =
293 static_cast<autogen::ServiceTemplate *
>(st_node->
GetObject());
294 autogen::ServiceTemplateType svc_template_props =
295 svc_template->properties();
299 svc_template_props.service_type);
303 svc_template_props.service_virtualization_type);
307 svc_template_props.vrouter_instance_type);
309 properties->
image_name = svc_template_props.image_name;
310 properties->
instance_data = svc_template_props.instance_data;
314 const std::vector<autogen::KeyValuePair> &kvps = properties->
instance_kvps;
315 std::vector<autogen::KeyValuePair>::const_iterator iter;
316 for (iter = kvps.begin(); iter != kvps.end(); ++iter) {
317 autogen::KeyValuePair kvp = *iter;
318 if (kvp.key ==
"lb_uuid") {
357 std::vector<autogen::KeyValuePair>::const_iterator iter;
359 autogen::KeyValuePair kvp = *iter;
367 const std::vector<autogen::KeyValuePair> &rhs) {
370 int remining_rhs_items;
371 std::vector<autogen::KeyValuePair>::const_iterator iter1;
372 std::vector<autogen::KeyValuePair>::const_iterator iter2;
377 remining_rhs_items = rhs.end() - rhs.begin();
378 while (iter1 != lhs.end()) {
379 while (iter2 != rhs.end()) {
380 if (iter1->key.compare(iter2->key) == 0) {
381 if ((ret = iter1->value.compare(iter2->value)) != 0) {
384 remining_rhs_items--;
398 if (remining_rhs_items)
404 template <
typename Type>
405 static int compare(
const Type &lhs,
const Type &rhs) {
489 const std::vector<autogen::KeyValuePair> &rhs,
490 std::stringstream *ss) {
493 int remining_rhs_items;
494 std::vector<autogen::KeyValuePair>::const_iterator iter1;
495 std::vector<autogen::KeyValuePair>::const_iterator iter2;
500 remining_rhs_items = rhs.size();
501 while (iter1 != lhs.end()) {
502 while (iter2 != rhs.end()) {
503 if (iter1->key.compare(iter2->key) == 0) {
504 remining_rhs_items--;
506 if ((ret = iter1->value.compare(iter2->value)) != 0) {
507 *ss << iter1->key <<
": -" << iter1->value;
508 *ss <<
" +" << iter2->value;
515 *ss <<
" -" << iter1->key <<
": " << iter1->value;
522 if (remining_rhs_items == 0)
528 while (iter1 != rhs.end()) {
529 while (iter2 != lhs.end()) {
530 if (iter1->key.compare(iter2->key) == 0) {
537 *ss <<
" +" << iter1->key <<
": " << iter1->value;
547 std::stringstream ss;
550 ss <<
" type: -" << service_type <<
" +" << rhs.
service_type;
553 ss <<
" virtualization: -" << virtualization_type
557 ss <<
" vrouter-instance-type: -" << vrouter_instance_type
561 ss <<
" id: -" << instance_id <<
" +" << rhs.
instance_id;
564 ss <<
" vmi-inside: -" << vmi_inside <<
" +" << rhs.
vmi_inside;
567 ss <<
" vmi-outside: -" << vmi_outside <<
" +" << rhs.
vmi_outside;
570 ss <<
" ip-inside: -" << ip_addr_inside
574 ss <<
" ip-outside: -" << ip_addr_outside
578 ss <<
" pfx-inside: -" << ip_prefix_len_inside
582 ss <<
" pfx-outside: -" << ip_prefix_len_outside
587 ss <<
" loadbalancer_id: -" << loadbalancer_id <<
" +"
592 ss <<
" gw_ip: -" << gw_ip <<
" +" << rhs.
gw_ip;
595 ss <<
" image: -" << image_name <<
" +" << rhs.
image_name;
598 ss <<
" image: -" << instance_data <<
" +" << rhs.
instance_data;
607 if (instance_id.is_nil()) {
616 bool common = (!vmi_outside.is_nil() &&
617 !ip_addr_outside.empty() &&
618 (ip_prefix_len_outside >= 0));
623 if (service_type ==
SourceNAT || interface_count == 2) {
624 bool outside = (!vmi_inside.is_nil() &&
625 !ip_addr_inside.empty() &&
626 (ip_prefix_len_inside >= 0));
636 if (loadbalancer_id.empty())
645 static_cast<ServiceType>(service_type));
676 ServiceInstanceResp *resp =
static_cast<ServiceInstanceResp *
> (sresp);
679 if (! name.empty() && str_uuid != name) {
683 ServiceInstanceSandeshData data;
685 data.set_uuid(str_uuid);
690 data.set_virtualization_type(
692 static_cast<VirtualizationType>(
707 NamespaceStateSandeshData state_data;
710 state_data.set_errors(state->
errors());
711 state_data.set_pid(state->
pid());
712 state_data.set_status(state->
status());
715 data.set_ns_state(state_data);
718 std::vector<ServiceInstanceSandeshData> &list =
719 const_cast<std::vector<ServiceInstanceSandeshData>&
>
720 (resp->get_service_instance_list());
721 list.push_back(data);
730 void ServiceInstanceReq::HandleRequest()
const {
733 sand->DoSandesh(sand);
747 graph_(NULL), dependency_manager_(NULL) {
758 **svc_instancep,
const DBRequest *request) {
777 *svc_instancep = svc_instance;
781 svc_instance->
SetKey(request->
key.get());
791 LOG(DEBUG,
"service-instance properties change" <<
836 assert(!
id.is_nil());
870 if (vm_node == NULL) {
874 autogen::ServiceInstance *svc_instance =
875 static_cast<autogen::ServiceInstance *
>(node->
GetObject());
885 autogen::ServiceInstance *svc_instance =
886 static_cast<autogen::ServiceInstance *
>(node->
GetObject());
887 const autogen::IdPermsType &
id = svc_instance->id_perms();
901 if ((old_uuid != new_uuid)) {
902 if (old_uuid != boost::uuids::nil_uuid()) {
911 assert(new_uuid != boost::uuids::nil_uuid());
915 if (old_uuid == boost::uuids::nil_uuid()) {
929 DB *db,
const std::string &name) {
955 const std::string &
type) {
964 const std::string &
type) {
976 if (it->second == type) {
987 if (it->second == type) {
998 if (it->second == type) {
boost::uuids::uuid uuid()
std::string mac_addr_management
static StrTypeToIntMap vrouter_instance_type_map_
static StrTypeToIntMap InitVirtualizationTypeMap()
IFMapDependencyManager * dependency_manager_
void Initialize(DBGraph *graph, IFMapDependencyManager *dependency_manager)
static Agent * GetInstance()
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
static DBTableBase * CreateTable(DB *db, const std::string &name)
static void FindAndSetLoadbalancer(ServiceInstance::Properties *properties)
void SetObject(IFMapNode *node, DBEntry *entry)
std::string GetString(const std::string &key) const
std::string loadbalancer_id
static StrTypeToIntMap virtualization_type_map_
static int StrServiceTypeToInt(const std::string &type)
IFMapNodeState * IFMapNodeGet(IFMapNode *node)
static std::string FindInterfaceIp(DBGraph *graph, IFMapNode *vmi_node)
static StrTypeToIntMap InitServiceTypeMap()
static void FindAndSetTypes(DBGraph *graph, IFMapNode *si_node, ServiceInstance::Properties *properties)
std::string ip_addr_inside
static bool IsNodeType(IFMapNode *node, const char *node_typename)
void set_uuid(const boost::uuids::uuid &u)
static StrTypeToIntMap service_type_map_
void Register(const std::string &type, ChangeEventHandler handler)
void CalculateProperties(DBGraph *graph, IFMapNode *node, ServiceInstance::Properties *properties)
static int compare_kvps(const std::vector< autogen::KeyValuePair > &lhs, const std::vector< autogen::KeyValuePair > &rhs)
const std::string & ServiceTypeString() const
std::unique_ptr< DBRequestData > data
static IFMapNode * FindNetworkIpam(DBGraph *graph, IFMapNode *vn_ipam_node)
virtual const char * Typename() const =0
bool HandleAddChange(ServiceInstance **svc_instance, const DBRequest *key)
static bool SubNetContainsIpv4(const autogen::IpamSubnetType &subnet, const std::string &ip)
bool Enqueue(DBRequest *req)
void set_cmd(const std::string &cmd)
adjacency_iterator end(DBGraph *graph)
static std::string UuidToString(const boost::uuids::uuid &id)
virtual KeyPtr GetDBRequestKey() const
virtual bool OnChange(DBEntry *entry, const DBRequest *request)
virtual std::unique_ptr< DBEntry > AllocEntry(const DBRequestKey *key) const
std::unique_ptr< DBRequestKey > KeyPtr
static void FindAndSetInterfaces(DBGraph *graph, IFMapNode *vm_node, autogen::ServiceInstance *svc_instance, ServiceInstance::Properties *properties)
static StrTypeToIntMap InitVRouterInstanceTypeMap()
std::string ip_addr_management
static IFMapNode * FindNetwork(DBGraph *graph, IFMapNode *vmi_node)
int CompareTo(const Properties &rhs) const
InstanceManager * instance_manager()
InstanceState * GetState(ServiceInstance *) const
std::unique_ptr< DBRequestKey > key
boost::uuids::uuid instance_id
virtual bool IFNodeToUuid(IFMapNode *node, boost::uuids::uuid &id)
boost::uuids::uuid vmi_outside
boost::uuids::uuid vmi_management
void set_properties(const Properties &properties)
static uuid IdPermsGetUuid(const autogen::IdPermsType &id)
virtual AgentSandeshPtr GetAgentSandesh(const AgentSandeshArguments *args, const std::string &context)
std::vector< autogen::KeyValuePair > instance_kvps
std::string errors() const
class boost::shared_ptr< AgentSandesh > AgentSandeshPtr
static const std::string & IntServiceTypeToStr(const ServiceInstance::ServiceType &type)
std::string instance_data
static const std::string & IntVRouterInstanceTypeToStr(const ServiceInstance::VRouterInstanceType &type)
int ip_prefix_len_outside
virtual bool Delete(DBEntry *entry, const DBRequest *request)
bool DBEntrySandesh(Sandesh *sresp, std::string &name) const
int vrouter_instance_type
ServiceInstanceTable(DB *db, const std::string &name)
IFMapNodePtr SetState(IFMapNode *node)
const Properties & properties() const
virtual void SetKey(const DBRequestKey *key)
IFMapObject * GetObject()
static const std::string & IntVirtualizationTypeToStr(const ServiceInstance::VirtualizationType &type)
virtual DBEntry * Add(const DBRequest *request)
const boost::uuids::uuid & instance_id() const
std::string mac_addr_inside
static IFMapNode * FindAndSetVirtualMachine(DBGraph *graph, IFMapNode *si_node, ServiceInstance::Properties *properties)
static int compare(const Type &lhs, const Type &rhs)
void InstanceKvpsDiffString(const std::vector< autogen::KeyValuePair > &lhs, const std::vector< autogen::KeyValuePair > &rhs, std::stringstream *ss)
virtual bool IsLess(const DBEntry &rhs) const
static const std::string kOtherType
std::string DiffString(const Properties &rhs) const
std::pair< std::string, int > StrTypeToIntPair
#define LOG(_Level, _Msg)
static int StrVRouterInstanceTypeToInt(const std::string &type)
static int StrVirtualizationTypeToInt(const std::string &type)
virtual bool IFNodeToReq(IFMapNode *node, DBRequest &req, const boost::uuids::uuid &u)
ServiceInstanceCreate(IFMapNode *node)
void ChangeEventHandler(IFMapNode *node, DBEntry *entry)
int ip_prefix_len_management
void SetIFMapNodeState(IFMapDependencyManager::IFMapNodePtr ref)
boost::uuids::uuid vmi_inside
adjacency_iterator begin(DBGraph *graph)
std::string mac_addr_outside
virtual std::string ToString() const
DBTableBase * FindTable(const std::string &name)
std::map< std::string, int > StrTypeToIntMap
std::string ip_addr_outside