mirror of
https://github.com/OpenNebula/one.git
synced 2025-01-11 05:17:41 +03:00
B #2486: Do not use in-memory VLAN ID maps to work in HA
This commit is contained in:
parent
7b21aeb2de
commit
3e1661ea4b
@ -277,11 +277,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
const VectorAttribute vlan_conf;
|
const VectorAttribute vlan_conf;
|
||||||
|
|
||||||
/**
|
|
||||||
* Bitmap with vlan_id in use for the 802.1Q driver
|
|
||||||
*/
|
|
||||||
BitMap<4096> vlan_id_bitmap;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ID for the VLAN_BITMAP, to store it in the DB
|
* ID for the VLAN_BITMAP, to store it in the DB
|
||||||
*/
|
*/
|
||||||
@ -324,6 +319,16 @@ private:
|
|||||||
*/
|
*/
|
||||||
int set_vlan_id(VirtualNetwork * vn);
|
int set_vlan_id(VirtualNetwork * vn);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper functions to compute the next vlan_id for 802.1Q and VXLAN.
|
||||||
|
* @param vnid network id
|
||||||
|
* @param vlan_var, attribute to store the vlan_id
|
||||||
|
* @param auto_var, attribute to flag this vlan_id as auto generated
|
||||||
|
*/
|
||||||
|
int set_8021Q_id(int vnid, string& vlan_var, bool& auto_var);
|
||||||
|
|
||||||
|
int set_vxlan_id(int vnid, string& vlan_var, bool& auto_var);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a previously allocated VLAN ID if needed
|
* Free a previously allocated VLAN ID if needed
|
||||||
* @param vn pointer to the network
|
* @param vn pointer to the network
|
||||||
|
@ -49,7 +49,6 @@ VirtualNetworkPool::VirtualNetworkPool(
|
|||||||
const VectorAttribute * _vlan_conf,
|
const VectorAttribute * _vlan_conf,
|
||||||
const VectorAttribute * _vxlan_conf):
|
const VectorAttribute * _vxlan_conf):
|
||||||
PoolSQL(db, VirtualNetwork::table), vlan_conf(_vlan_conf),
|
PoolSQL(db, VirtualNetwork::table), vlan_conf(_vlan_conf),
|
||||||
vlan_id_bitmap(vlan_conf, VLAN_BITMAP_ID, vlan_table),
|
|
||||||
vxlan_conf(_vxlan_conf)
|
vxlan_conf(_vxlan_conf)
|
||||||
{
|
{
|
||||||
istringstream iss;
|
istringstream iss;
|
||||||
@ -59,6 +58,8 @@ VirtualNetworkPool::VirtualNetworkPool(
|
|||||||
|
|
||||||
vector<const SingleAttribute *>::const_iterator it;
|
vector<const SingleAttribute *>::const_iterator it;
|
||||||
|
|
||||||
|
BitMap<4096> vlan_id_bitmap(vlan_conf, VLAN_BITMAP_ID, vlan_table);
|
||||||
|
|
||||||
string mac = prefix;
|
string mac = prefix;
|
||||||
|
|
||||||
_mac_prefix = 0;
|
_mac_prefix = 0;
|
||||||
@ -353,8 +354,7 @@ void VirtualNetworkPool::authorize_nic(
|
|||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int set_8021Q_id(int vnid, string& vlan_var, bool& auto_var,
|
int VirtualNetworkPool::set_8021Q_id(int vnid, string& vlan_var, bool& auto_var)
|
||||||
BitMap<4096>& bitmap)
|
|
||||||
{
|
{
|
||||||
if ( !vlan_var.empty() || !auto_var )
|
if ( !vlan_var.empty() || !auto_var )
|
||||||
{
|
{
|
||||||
@ -364,6 +364,13 @@ static int set_8021Q_id(int vnid, string& vlan_var, bool& auto_var,
|
|||||||
unsigned int vlan_id;
|
unsigned int vlan_id;
|
||||||
ostringstream oss;
|
ostringstream oss;
|
||||||
|
|
||||||
|
BitMap<4096> bitmap(vlan_conf, VLAN_BITMAP_ID, vlan_table);
|
||||||
|
|
||||||
|
if ( bitmap.select(VLAN_BITMAP_ID, db) != 0 )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int start_vlan = bitmap.get_start_bit();
|
unsigned int start_vlan = bitmap.get_start_bit();
|
||||||
unsigned int hint_vlan = start_vlan + (vnid % (4095 - start_vlan));
|
unsigned int hint_vlan = start_vlan + (vnid % (4095 - start_vlan));
|
||||||
|
|
||||||
@ -372,6 +379,8 @@ static int set_8021Q_id(int vnid, string& vlan_var, bool& auto_var,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitmap.update(db);
|
||||||
|
|
||||||
oss << vlan_id;
|
oss << vlan_id;
|
||||||
|
|
||||||
vlan_var = oss.str();
|
vlan_var = oss.str();
|
||||||
@ -380,8 +389,7 @@ static int set_8021Q_id(int vnid, string& vlan_var, bool& auto_var,
|
|||||||
return vlan_id;
|
return vlan_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_vxlan_id(int vnid, string& vlan_var, bool& auto_var,
|
int VirtualNetworkPool::set_vxlan_id(int vnid, string& vlan_var, bool& auto_var)
|
||||||
unsigned int start_vlan)
|
|
||||||
{
|
{
|
||||||
if ( !vlan_var.empty() || !auto_var )
|
if ( !vlan_var.empty() || !auto_var )
|
||||||
{
|
{
|
||||||
@ -389,6 +397,14 @@ static int set_vxlan_id(int vnid, string& vlan_var, bool& auto_var,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ostringstream oss;
|
ostringstream oss;
|
||||||
|
|
||||||
|
unsigned int start_vlan;
|
||||||
|
|
||||||
|
if (vxlan_conf.vector_value("START", start_vlan) != 0)
|
||||||
|
{
|
||||||
|
start_vlan = 2; //default in oned.conf
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int vlan_id = start_vlan + vnid;
|
unsigned int vlan_id = start_vlan + vnid;
|
||||||
|
|
||||||
oss << vlan_id;
|
oss << vlan_id;
|
||||||
@ -403,7 +419,6 @@ static int set_vxlan_id(int vnid, string& vlan_var, bool& auto_var,
|
|||||||
|
|
||||||
int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
||||||
{
|
{
|
||||||
unsigned int start_vlan;
|
|
||||||
int rc, rcx;
|
int rc, rcx;
|
||||||
|
|
||||||
if ( vn->vn_mad.empty() )
|
if ( vn->vn_mad.empty() )
|
||||||
@ -411,28 +426,18 @@ int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vxlan_conf.vector_value("START", start_vlan) != 0)
|
|
||||||
{
|
|
||||||
start_vlan = 2; //default in oned.conf
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (VirtualNetwork::str_to_driver(vn->vn_mad))
|
switch (VirtualNetwork::str_to_driver(vn->vn_mad))
|
||||||
{
|
{
|
||||||
case VirtualNetwork::OVSWITCH_VXLAN:
|
case VirtualNetwork::OVSWITCH_VXLAN:
|
||||||
rc = set_8021Q_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic,
|
rc = set_8021Q_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic);
|
||||||
vlan_id_bitmap);
|
|
||||||
|
|
||||||
if ( rc == -1 )
|
if ( rc == -1 )
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if ( rc != 0 )
|
|
||||||
{
|
|
||||||
vlan_id_bitmap.update(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
rcx = set_vxlan_id(vn->get_oid(), vn->outer_vlan_id,
|
rcx = set_vxlan_id(vn->get_oid(), vn->outer_vlan_id,
|
||||||
vn->outer_vlan_id_automatic, start_vlan);
|
vn->outer_vlan_id_automatic);
|
||||||
|
|
||||||
if ( rc != 0 || rcx != 0 )
|
if ( rc != 0 || rcx != 0 )
|
||||||
{
|
{
|
||||||
@ -441,8 +446,7 @@ int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case VirtualNetwork::VXLAN:
|
case VirtualNetwork::VXLAN:
|
||||||
rcx = set_vxlan_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic,
|
rcx = set_vxlan_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic);
|
||||||
start_vlan);
|
|
||||||
|
|
||||||
if ( rcx != 0 )
|
if ( rcx != 0 )
|
||||||
{
|
{
|
||||||
@ -453,8 +457,7 @@ int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
|||||||
case VirtualNetwork::VLAN:
|
case VirtualNetwork::VLAN:
|
||||||
case VirtualNetwork::VCENTER:
|
case VirtualNetwork::VCENTER:
|
||||||
case VirtualNetwork::OVSWITCH:
|
case VirtualNetwork::OVSWITCH:
|
||||||
rc = set_8021Q_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic,
|
rc = set_8021Q_id(vn->get_oid(), vn->vlan_id, vn->vlan_id_automatic);
|
||||||
vlan_id_bitmap);
|
|
||||||
|
|
||||||
if ( rc == -1 )
|
if ( rc == -1 )
|
||||||
{
|
{
|
||||||
@ -462,7 +465,6 @@ int VirtualNetworkPool::set_vlan_id(VirtualNetwork * vn)
|
|||||||
}
|
}
|
||||||
else if ( rc != 0 )
|
else if ( rc != 0 )
|
||||||
{
|
{
|
||||||
vlan_id_bitmap.update(db);
|
|
||||||
update(vn);
|
update(vn);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -505,17 +507,29 @@ void VirtualNetworkPool::release_vlan_id(VirtualNetwork *vn)
|
|||||||
is.str(vn->vlan_id);
|
is.str(vn->vlan_id);
|
||||||
is >> vlan_id;
|
is >> vlan_id;
|
||||||
|
|
||||||
|
BitMap<4096> bitmap(vlan_conf, VLAN_BITMAP_ID, vlan_table);
|
||||||
|
|
||||||
switch (VirtualNetwork::str_to_driver(vn->vn_mad))
|
switch (VirtualNetwork::str_to_driver(vn->vn_mad))
|
||||||
{
|
{
|
||||||
case VirtualNetwork::VLAN:
|
case VirtualNetwork::VLAN:
|
||||||
case VirtualNetwork::VCENTER:
|
case VirtualNetwork::VCENTER:
|
||||||
case VirtualNetwork::OVSWITCH:
|
case VirtualNetwork::OVSWITCH:
|
||||||
case VirtualNetwork::OVSWITCH_VXLAN:
|
case VirtualNetwork::OVSWITCH_VXLAN:
|
||||||
vlan_id_bitmap.reset(vlan_id);
|
if ( bitmap.select(VLAN_BITMAP_ID, db) != 0 )
|
||||||
vlan_id_bitmap.update(db);
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bitmap.reset(vlan_id);
|
||||||
|
bitmap.update(db);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
case VirtualNetwork::NONE:
|
||||||
|
case VirtualNetwork::DUMMY:
|
||||||
|
case VirtualNetwork::EBTABLES:
|
||||||
|
case VirtualNetwork::FW:
|
||||||
|
case VirtualNetwork::VXLAN:
|
||||||
|
case VirtualNetwork::BRIDGE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user