1
0
mirror of https://github.com/OpenNebula/one.git synced 2024-12-23 17:33:56 +03:00

feature #2858: Hold and Release for IP/MAC addresses in all Address Ranges. Keep compatibility with 4.6 interface

This commit is contained in:
Ruben S. Montero 2014-05-19 17:59:06 +02:00
parent 14105efd0d
commit e6301350d0
5 changed files with 173 additions and 42 deletions

View File

@ -168,6 +168,15 @@ public:
*/
int free_addr(PoolObjectSQL::ObjectType ot, int obid, const string& mac);
/**
* Frees a previous allocated address, referenced by its IP address
* @param ot the object type of the owner of the address
* @param obid the id of the owner of the address
* @param ip the IP address in string form
* @return 0 if the address was freed
*/
int free_addr_by_ip(PoolObjectSQL::ObjectType ot, int id, const string& ip);
/**
* Return the id for this address range
*/

View File

@ -128,7 +128,7 @@ public:
int hold_by_mac(const string& mac);
/**
* Frees the given address by MAC
* Frees the given address by MAC on the given address range
* @param arid the ID of the address range
* @param ot the type of the object requesting the address (VM or NET)
* @param obid the id of the object requesting the address
@ -137,6 +137,36 @@ public:
void free_addr(unsigned int arid, PoolObjectSQL::ObjectType ot, int obid,
const string& mac);
/**
* Frees the given address by IP on the given address range
* @param arid the ID of the address range
* @param ot the type of the object requesting the address (VM or NET)
* @param obid the id of the object requesting the address
* @param ip the specific IP address requested
*/
void free_addr_by_ip(unsigned int arid, PoolObjectSQL::ObjectType ot,
int obid, const string& ip);
/**
* Frees the given address by MAC from all address ranges containing
* the MAC
* @param arid the ID of the address range
* @param ot the type of the object requesting the address (VM or NET)
* @param obid the id of the object requesting the address
* @param mac the specific MAC address requested
*/
void free_addr(PoolObjectSQL::ObjectType ot, int obid, const string& mac);
/**
* Frees the given address by IP from all address ranges containing
* the IP
* @param arid the ID of the address range
* @param ot the type of the object requesting the address (VM or NET)
* @param obid the id of the object requesting the address
* @param ip the specific IP address requested
*/
void free_addr_by_ip(PoolObjectSQL::ObjectType ot, int id, const string& ip);
/**
* Return the number of used addresses
*/

View File

@ -624,11 +624,13 @@ void AddressRange::allocate_addr(PoolObjectSQL::ObjectType ot, int obid,
int AddressRange::free_addr(PoolObjectSQL::ObjectType ot, int obid,
unsigned int addr_index)
{
long long lobid = obid & 0x00000000FFFFFFFFLL;
map<unsigned int, long long>::iterator it;
it = allocated.find(addr_index);
if (it != allocated.end() && it->second == (ot|obid))
if (it != allocated.end() && it->second == (ot|lobid))
{
allocated.erase(it);
allocated_to_attr();
@ -790,7 +792,35 @@ int AddressRange::free_addr(PoolObjectSQL::ObjectType ot, int obid,
unsigned int index = mac_i[0] - mac[0];
if ((mac_i[0] >= mac[0]) && (index < size))
if ((0 <= index) && (index < size))
{
return free_addr(ot, obid, index);
}
return -1;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int AddressRange::free_addr_by_ip(PoolObjectSQL::ObjectType ot, int obid,
const string& ip_s)
{
if (!(type & 0x00000002))//Not of type IP4 or IP4_6
{
return -1;
}
unsigned int ip_i;
if (ip_to_i(ip_s, ip_i) == -1)
{
return -1;
}
unsigned int index = ip_i - ip;
if ((0 <= index ) && (index < size))
{
return free_addr(ot, obid, index);
}

View File

@ -222,6 +222,59 @@ void AddressRangePool::free_addr(unsigned int arid, PoolObjectSQL::ObjectType ot
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void AddressRangePool::free_addr_by_ip(unsigned int arid,
PoolObjectSQL::ObjectType ot, int obid, const string& ip)
{
map<unsigned int, AddressRange *>::iterator it;
it = ar_pool.find(arid);
if (it!=ar_pool.end())
{
if ( it->second->free_addr_by_ip(ot, obid, ip) == 0 )
{
used_addr--;
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void AddressRangePool::free_addr(PoolObjectSQL::ObjectType ot, int obid,
const string& mac_s)
{
map<unsigned int, AddressRange *>::iterator it;
for (it=ar_pool.begin(); it!=ar_pool.end(); it++)
{
if (it->second->free_addr(ot, obid, mac_s) == 0)
{
used_addr--;
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void AddressRangePool::free_addr_by_ip(PoolObjectSQL::ObjectType ot, int obid,
const string& ip_s)
{
map<unsigned int, AddressRange *>::iterator it;
for (it=ar_pool.begin(); it!=ar_pool.end(); it++)
{
if (it->second->free_addr_by_ip(ot, obid, ip_s) == 0)
{
used_addr--;
}
}
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void AddressRangePool::get_attribute(const char * name, string& value,
int ar_id) const
{
@ -251,7 +304,14 @@ int AddressRangePool::hold_by_ip(unsigned int ar_id, const string& ip_s)
return -1;
}
return it->second->hold_by_ip(ip_s);
int rc = it->second->hold_by_ip(ip_s);
if (rc == 0)
{
used_addr++;
}
return rc;
}
/* -------------------------------------------------------------------------- */
@ -260,16 +320,18 @@ int AddressRangePool::hold_by_ip(unsigned int ar_id, const string& ip_s)
int AddressRangePool::hold_by_ip(const string& ip_s)
{
map<unsigned int, AddressRange *>::iterator it;
int rc = -1;
for (it=ar_pool.begin(); it!=ar_pool.end(); it++)
{
if (it->second->hold_by_ip(ip_s) == 0)
if (it->second->hold_by_ip(ip_s) == 0) //At least one AR hold the IP
{
return 0;
used_addr++;
rc = 0;
}
}
return -1;
return rc;
}
/* -------------------------------------------------------------------------- */
@ -286,7 +348,14 @@ int AddressRangePool::hold_by_mac(unsigned int ar_id, const string& mac_s)
return -1;
}
return it->second->hold_by_mac(mac_s);
int rc = it->second->hold_by_mac(mac_s);
if (rc == 0)
{
used_addr++;
}
return rc;
}
/* -------------------------------------------------------------------------- */
@ -295,14 +364,16 @@ int AddressRangePool::hold_by_mac(unsigned int ar_id, const string& mac_s)
int AddressRangePool::hold_by_mac(const string& mac_s)
{
map<unsigned int, AddressRange *>::iterator it;
int rc = -1;
for (it=ar_pool.begin(); it!=ar_pool.end(); it++)
{
if (it->second->hold_by_mac(mac_s) == 0)
if (it->second->hold_by_mac(mac_s) == 0) //At least one AR hold the IP
{
return 0;
used_addr++;
rc = 0;
}
}
return -1;
return rc;
}

View File

@ -651,7 +651,7 @@ int VirtualNetwork::hold_leases(VirtualNetworkTemplate * leases_template,
return -1;
}
if (lease->vector_value("AR_ID", ar_id) != 0) //No AR__ID hold fist address
if (lease->vector_value("AR_ID", ar_id) != 0) //No AR_ID hold all addresses
{
if (!mac.empty())
{
@ -706,51 +706,42 @@ int VirtualNetwork::free_leases(VirtualNetworkTemplate * leases_template,
return -1;
}
int rc;
unsigned int ar_id;
string ip = lease->vector_value("IP");
string mac = lease->vector_value("MAC");
if (lease->vector_value("AR_ID", ar_id) != 0)
{
error_msg = "Missing address range ID (AR_ID).";
return -1;
}
if (!mac.empty())
{
rc = ar_pool.hold_by_mac(ar_id, mac);
}
else if (!ip.empty())
{
rc = ar_pool.hold_by_ip(ar_id, ip);
}
else
if (ip.empty() && mac.empty())
{
error_msg = "Missing MAC or IP.";
return -1;
}
if (rc!=0)
if (lease->vector_value("AR_ID", ar_id) != 0) //No AR_ID free all addresses
{
error_msg = "Address is not part of the address range or in use.";
if (!mac.empty())
{
ar_pool.free_addr(PoolObjectSQL::VM, -1, mac);
}
else if (!ip.empty())
{
ar_pool.free_addr_by_ip(PoolObjectSQL::VM, -1, ip);
}
}
else
{
if (!mac.empty())
{
ar_pool.free_addr(ar_id, PoolObjectSQL::VM, -1, mac);
}
else if (!ip.empty())
{
ar_pool.free_addr_by_ip(ar_id, PoolObjectSQL::VM, -1, ip);
}
}
return rc;
vector<const Attribute *> vector_leases;
leases_template->get("LEASES", vector_leases);
//TODO
return 0;
//return leases->free_leases(vector_leases, error_msg);
}
/* -------------------------------------------------------------------------- */