2008-11-13 16:21:17 +00:00
/* -------------------------------------------------------------------------- */
2016-05-04 12:33:23 +02:00
/* Copyright 2002-2016, OpenNebula Project, OpenNebula Systems */
2008-11-13 16:21:17 +00:00
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); you may */
/* not use this file except in compliance with the License. You may obtain */
/* a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* -------------------------------------------------------------------------- */
# ifndef VIRTUAL_NETWORK_POOL_H_
# define VIRTUAL_NETWORK_POOL_H_
# include "PoolSQL.h"
# include "VirtualNetwork.h"
2016-04-06 18:07:56 +02:00
# include "BitMap.h"
2008-11-13 16:21:17 +00:00
# include <time.h>
2010-07-14 18:11:29 +02:00
class AuthRequest ;
2016-12-24 01:35:33 +01:00
class VirtualMachineNic ;
2010-07-14 18:11:29 +02:00
2008-11-13 16:21:17 +00:00
using namespace std ;
/**
* The Virtual Network Pool class . . . .
*/
class VirtualNetworkPool : public PoolSQL
{
public :
2016-04-07 11:06:43 +02:00
VirtualNetworkPool ( SqlDB * db ,
const string & str_mac_prefix ,
int default_size ,
vector < const SingleAttribute * > & restricted_attrs ,
vector < const VectorAttribute * > & hook_mads ,
const string & remotes_location ,
const vector < const SingleAttribute * > & _inherit_attrs ,
const VectorAttribute * vlan_conf ,
const VectorAttribute * vxlan_conf ) ;
2008-11-13 16:21:17 +00:00
~ VirtualNetworkPool ( ) { } ;
2016-04-06 18:07:56 +02:00
//--------------------------------------------------------------------------
// Virtual Network DB access functions
//--------------------------------------------------------------------------
2008-11-13 16:21:17 +00:00
/**
2010-07-14 19:37:43 +02:00
* Function to allocate a new VNET object
2008-11-13 16:21:17 +00:00
* @ param uid user identifier
Feature #407: Add 'GID' attribute to some pool objects; change *pool.info XML-RPC flag meaning; update onedb migrator; fix tests.
* VM, VMTEMPLATE, VNET & IMAGE objects have a GID attribute, and a table column. The group id is inherited from the user creating the object, except for VMs created from Templates, that inherit the Template's group.
* The new flag meaning has been modified in src/rm sources and CLI commands for one.(vm,template,vnet,image)pool.info . It changes from
-2 all, -1 mine & public, >=0 UID
to
-3 mine, -2 all, -1 mine & group
* USER has a group, but not secondary ones. The user_pool table doesn't have a GID column, we'll deal with it later when the group-users relations are implemented.
* onedb migrator 1.rb: deleted USERNAME, and GID added.
2011-05-16 17:00:27 +02:00
* @ param gid the id of the group this object is assigned to
2013-01-18 18:34:51 +01:00
* @ param uname user name
* @ param gname group name
* @ param umask permissions umask
2010-07-14 19:37:43 +02:00
* @ param vn_template a VirtualNetworkTemplate describing the VNET
2008-11-13 16:21:17 +00:00
* @ param oid the id assigned to the VM ( output )
2016-03-10 16:28:33 +01:00
* @ param cluster_ids the ids of the clusters this VNET will belong to
2011-05-12 17:10:35 +02:00
* @ param error_str Returns the error reason , if any
2010-07-14 19:37:43 +02:00
* @ return oid on success , - 1 error
2008-11-13 16:21:17 +00:00
*/
int allocate (
2011-05-12 17:10:35 +02:00
int uid ,
Feature #407: Add 'GID' attribute to some pool objects; change *pool.info XML-RPC flag meaning; update onedb migrator; fix tests.
* VM, VMTEMPLATE, VNET & IMAGE objects have a GID attribute, and a table column. The group id is inherited from the user creating the object, except for VMs created from Templates, that inherit the Template's group.
* The new flag meaning has been modified in src/rm sources and CLI commands for one.(vm,template,vnet,image)pool.info . It changes from
-2 all, -1 mine & public, >=0 UID
to
-3 mine, -2 all, -1 mine & group
* USER has a group, but not secondary ones. The user_pool table doesn't have a GID column, we'll deal with it later when the group-users relations are implemented.
* onedb migrator 1.rb: deleted USERNAME, and GID added.
2011-05-16 17:00:27 +02:00
int gid ,
2011-06-30 11:31:00 +02:00
const string & uname ,
const string & gname ,
2013-01-18 18:34:51 +01:00
int umask ,
2014-05-30 18:59:25 +02:00
int parent_vid ,
2011-05-12 17:10:35 +02:00
VirtualNetworkTemplate * vn_template ,
int * oid ,
2016-03-10 16:28:33 +01:00
const set < int > & cluster_ids ,
2011-05-12 17:10:35 +02:00
string & error_str ) ;
2008-11-13 16:21:17 +00:00
2016-04-06 18:07:56 +02:00
/**
* Drops a Virtual Network and the associated VLAN_ID if needed
*/
2016-04-19 15:22:17 +02:00
int drop ( PoolObjectSQL * vn , string & error_msg )
2016-04-06 18:07:56 +02:00
{
2016-04-19 15:22:17 +02:00
release_vlan_id ( static_cast < VirtualNetwork * > ( vn ) ) ;
2016-04-06 18:07:56 +02:00
return PoolSQL : : drop ( vn , error_msg ) ;
} ;
2008-11-13 16:21:17 +00:00
/**
* Function to get a VN from the pool , if the object is not in memory
* it is loaded from the DB
* @ param oid VN unique id
* @ param lock locks the VN mutex
* @ return a pointer to the VN , 0 if the VN could not be loaded
*/
2011-03-05 03:24:11 +01:00
VirtualNetwork * get ( int oid , bool lock )
2008-11-13 16:21:17 +00:00
{
return static_cast < VirtualNetwork * > ( PoolSQL : : get ( oid , lock ) ) ;
} ;
2010-04-05 23:34:09 +02:00
2011-07-12 19:30:00 +02:00
/**
* Gets an object from the pool ( if needed the object is loaded from the
* database ) .
* @ param name of the object
* @ param uid id of owner
* @ param lock locks the object if true
*
* @ return a pointer to the object , 0 in case of failure
*/
VirtualNetwork * get ( const string & name , int uid , bool lock )
{
return static_cast < VirtualNetwork * > ( PoolSQL : : get ( name , uid , lock ) ) ;
} ;
2008-11-13 16:21:17 +00:00
/**
* Bootstraps the database table ( s ) associated to the VirtualNetwork pool
2011-10-10 06:14:46 -07:00
* @ return 0 on success
2008-11-13 16:21:17 +00:00
*/
2011-10-10 06:14:46 -07:00
static int bootstrap ( SqlDB * _db )
2008-11-13 16:21:17 +00:00
{
2016-04-06 18:07:56 +02:00
ostringstream oss ;
int rc ;
rc = VirtualNetwork : : bootstrap ( _db ) ;
2017-04-18 16:32:23 +02:00
rc + = _db - > exec_bootstrap ( BitMap < 0 > : : bootstrap ( vlan_table , oss ) ) ;
2016-04-06 18:07:56 +02:00
return rc ;
2008-11-13 16:21:17 +00:00
} ;
2010-04-05 23:34:09 +02:00
2008-11-13 16:21:17 +00:00
/**
2010-04-10 22:15:47 +02:00
* Dumps the Virtual Network pool in XML format . A filter can be also added
* to the query
2009-07-09 14:34:34 +00:00
* @ param oss the output stream to dump the pool contents
* @ param where filter for the objects , defaults to all
2014-01-13 16:30:43 +01:00
* @ param limit parameters used for pagination
2009-07-09 14:34:34 +00:00
*
* @ return 0 on success
2008-11-13 16:21:17 +00:00
*/
2014-01-13 16:30:43 +01:00
int dump ( ostringstream & oss , const string & where , const string & limit )
2011-03-09 13:23:01 +01:00
{
2014-01-13 16:30:43 +01:00
return PoolSQL : : dump ( oss , " VNET_POOL " , VirtualNetwork : : table , where ,
limit ) ;
2011-03-09 13:23:01 +01:00
}
2009-07-09 14:34:34 +00:00
2010-07-01 19:04:52 +02:00
/**
* Get the mac prefix
* @ return the mac prefix
*/
static const unsigned int & mac_prefix ( )
{
return _mac_prefix ;
} ;
/**
* Get the default network size
* @ return the size
*/
static const unsigned int & default_size ( )
{
return _default_size ;
} ;
2014-09-11 10:34:18 +02:00
/**
* Gets the IDs of VNETs matching the given SQL where string .
* @ param oids a vector that contains the IDs
* @ param where SQL clause
* @ return 0 on success
*/
int search ( vector < int > & oids , const string & where )
{
return PoolSQL : : search ( oids , VirtualNetwork : : table , where ) ;
} ;
2016-04-06 18:07:56 +02:00
//--------------------------------------------------------------------------
// NIC Attribute build functions
//--------------------------------------------------------------------------
/**
* Generates a NIC attribute for VM templates using the VirtualNetwork
* metadata
* @ param nic the nic attribute to be generated
* @ param nic_id the id for this NIC
* @ param uid of the VM owner
* @ param vid of the VM requesting the lease
* @ param error_str string describing the error
* @ return 0 on success ,
* - 1 error ,
* - 2 not using the pool
*/
int nic_attribute (
PoolObjectSQL : : ObjectType ot ,
2016-12-24 01:35:33 +01:00
VirtualMachineNic * nic ,
2016-04-06 18:07:56 +02:00
int nic_id ,
int uid ,
int vid ,
string & error_str ) ;
/**
* Generates an Authorization token for a NIC attribute
* @ param nic the nic to be authorized
* @ param ar the AuthRequest
*/
void authorize_nic (
PoolObjectSQL : : ObjectType ot ,
2016-12-24 01:35:33 +01:00
VirtualMachineNic * nic ,
2016-04-06 18:07:56 +02:00
int uid ,
AuthRequest * ar ) ;
2016-06-03 19:16:51 +02:00
//--------------------------------------------------------------------------
// VNET Reservation interface
//--------------------------------------------------------------------------
/**
* Reserve an address range
* @ param pid the parent VNET ID to get the leases from
* @ param rid the reservation VNET ID to store the reserved AR
* @ param rsize number of addresses to reserve
* @ param err error message
* @ return 0 on success
*/
int reserve_addr ( int pid , int rid , unsigned int rsize , string & err ) ;
/**
* Reserve an address range
* @ param pid the parent VNET ID to get the leases from
* @ param rid the reservation VNET ID to store the reserved AR
* @ param rsize number of addresses to reserve
* @ param ar_id AR to make the reservation from
* @ param err error message
* @ return 0 on success
*/
int reserve_addr ( int pid , int rid , unsigned int rsize , unsigned int ar_id ,
string & err ) ;
/**
* Reserve an address range
* @ param pid the parent VNET ID to get the leases from
* @ param rid the reservation VNET ID to store the reserved AR
* @ param rsize number of addresses to reserve
* @ param ar_id AR to make the reservation from
2017-02-21 16:50:45 +01:00
* @ param ip / mac the first ip / mac in the reservations
2016-06-03 19:16:51 +02:00
* @ param err error message
* @ return 0 on success
*/
int reserve_addr_by_ip ( int pid , int rid , unsigned int rsize ,
unsigned int ar_id , const string & ip , string & err ) ;
2017-02-21 16:50:45 +01:00
int reserve_addr_by_ip6 ( int pid , int rid , unsigned int rsize ,
unsigned int ar_id , const string & ip , string & err ) ;
2016-06-03 19:16:51 +02:00
int reserve_addr_by_mac ( int pid , int rid , unsigned int rsize ,
unsigned int ar_id , const string & mac , string & err ) ;
2017-02-21 16:50:45 +01:00
2009-07-09 14:34:34 +00:00
private :
2008-11-13 16:21:17 +00:00
/**
* Holds the system - wide MAC prefix
*/
2016-04-06 18:07:56 +02:00
static unsigned int _mac_prefix ;
2010-04-05 23:34:09 +02:00
2008-11-13 16:21:17 +00:00
/**
* Default size for Virtual Networks
*/
2016-04-06 18:07:56 +02:00
static unsigned int _default_size ;
2010-04-05 23:34:09 +02:00
2013-11-14 11:49:53 +01:00
/**
* VNet attributes to be injected into the VM nic
*/
vector < string > inherit_attrs ;
2009-07-09 14:34:34 +00:00
/**
2016-04-06 18:07:56 +02:00
* Configuration attributes for the vlan_id pool
2009-07-09 14:34:34 +00:00
*/
2016-04-06 18:07:56 +02:00
const VectorAttribute vlan_conf ;
2011-11-12 23:39:10 +01:00
2016-04-06 18:07:56 +02:00
/**
* Bitmap with vlan_id in use for the 802.1 Q driver
*/
BitMap < 4096 > vlan_id_bitmap ;
/**
* ID for the VLAN_BITMAP , to store it in the DB
*/
static const int VLAN_BITMAP_ID ;
/**
* Configuration attributes for the vxlan_id pool
*/
const VectorAttribute vxlan_conf ;
/**
* Virtual Network bitmap pool for VLANs table
*/
static const char * vlan_table ;
//--------------------------------------------------------------------------
// NIC Attribute build functions
//--------------------------------------------------------------------------
2011-11-12 23:39:10 +01:00
/**
2012-10-08 12:33:32 +02:00
* Function to get a VirtualNetwork by its name , as provided by a VM
2011-11-12 23:39:10 +01:00
* template
*/
2016-12-24 01:35:33 +01:00
VirtualNetwork * get_nic_by_name ( VirtualMachineNic * nic ,
2011-11-12 23:39:10 +01:00
const string & name ,
2012-02-24 21:13:56 +01:00
int _uidi ,
string & error ) ;
2011-11-12 23:39:10 +01:00
/**
* Function to get a VirtualNetwork by its id , as provided by a VM template
*/
2012-02-24 21:13:56 +01:00
VirtualNetwork * get_nic_by_id ( const string & id_s , string & error ) ;
2016-04-06 18:07:56 +02:00
//--------------------------------------------------------------------------
// VLAN ID management functions
//--------------------------------------------------------------------------
/**
* Gets a free VLAN_ID , if not set by the user , and for VXLAN , VLAN and
2016-04-19 15:20:45 +02:00
* OVSWITCH networks .
2016-04-06 18:07:56 +02:00
* @ param vn pointer to the network
* @ return 0 on success
*/
int set_vlan_id ( VirtualNetwork * vn ) ;
/**
* Free a previously allocated VLAN ID if needed
* @ param vn pointer to the network
*/
void release_vlan_id ( VirtualNetwork * vn ) ;
2016-06-03 19:16:51 +02:00
//--------------------------------------------------------------------------
// VNET Reservation Functions
//--------------------------------------------------------------------------
/**
* Allocate a new AR from the given VNET
* @ param rid VNET ID
* @ param err string if any
* @ return pointer to the allocated AR
*/
AddressRange * allocate_ar ( int rid , string & err ) ;
/**
* Adds a new AR to a VNET
* @ param rid VNET ID
* @ param ar pointer to the AR
* @ param err string if any
* @ return 0 on success
*/
int add_ar ( int rid , AddressRange * rar , string & err ) ;
2016-04-06 18:07:56 +02:00
/**
* Factory method to produce VN objects
* @ return a pointer to the new VN
*/
PoolObjectSQL * create ( )
{
set < int > empty ;
return new VirtualNetwork ( - 1 , - 1 , " " , " " , 0 , - 1 , empty , 0 ) ;
} ;
2008-11-13 16:21:17 +00:00
} ;
2010-04-05 23:34:09 +02:00
2010-06-07 17:51:46 +02:00
# endif /*VIRTUAL_NETWORK_POOL_H_*/