2008-11-13 19:21:17 +03:00
/* -------------------------------------------------------------------------- */
2019-01-16 13:27:59 +03:00
/* Copyright 2002-2019, OpenNebula Project, OpenNebula Systems */
2008-11-13 19:21:17 +03: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 19:07:56 +03:00
# include "BitMap.h"
2008-11-13 19:21:17 +03:00
# include <time.h>
2010-07-14 20:11:29 +04:00
class AuthRequest ;
2016-12-24 03:35:33 +03:00
class VirtualMachineNic ;
2010-07-14 20:11:29 +04:00
2008-11-13 19:21:17 +03:00
using namespace std ;
/**
* The Virtual Network Pool class . . . .
*/
class VirtualNetworkPool : public PoolSQL
{
public :
2016-04-07 12:06:43 +03: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 19:21:17 +03:00
~ VirtualNetworkPool ( ) { } ;
2016-04-06 19:07:56 +03:00
//--------------------------------------------------------------------------
// Virtual Network DB access functions
//--------------------------------------------------------------------------
2008-11-13 19:21:17 +03:00
/**
2010-07-14 21:37:43 +04:00
* Function to allocate a new VNET object
2008-11-13 19:21:17 +03: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 19:00:27 +04:00
* @ param gid the id of the group this object is assigned to
2013-01-18 21:34:51 +04:00
* @ param uname user name
* @ param gname group name
* @ param umask permissions umask
2010-07-14 21:37:43 +04:00
* @ param vn_template a VirtualNetworkTemplate describing the VNET
2008-11-13 19:21:17 +03:00
* @ param oid the id assigned to the VM ( output )
2016-03-10 18:28:33 +03:00
* @ param cluster_ids the ids of the clusters this VNET will belong to
2011-05-12 19:10:35 +04:00
* @ param error_str Returns the error reason , if any
2010-07-14 21:37:43 +04:00
* @ return oid on success , - 1 error
2008-11-13 19:21:17 +03:00
*/
int allocate (
2011-05-12 19:10:35 +04: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 19:00:27 +04:00
int gid ,
2011-06-30 13:31:00 +04:00
const string & uname ,
const string & gname ,
2013-01-18 21:34:51 +04:00
int umask ,
2014-05-30 20:59:25 +04:00
int parent_vid ,
2011-05-12 19:10:35 +04:00
VirtualNetworkTemplate * vn_template ,
int * oid ,
2016-03-10 18:28:33 +03:00
const set < int > & cluster_ids ,
2011-05-12 19:10:35 +04:00
string & error_str ) ;
2008-11-13 19:21:17 +03:00
2016-04-06 19:07:56 +03:00
/**
* Drops a Virtual Network and the associated VLAN_ID if needed
*/
2016-04-19 16:22:17 +03:00
int drop ( PoolObjectSQL * vn , string & error_msg )
2016-04-06 19:07:56 +03:00
{
2016-04-19 16:22:17 +03:00
release_vlan_id ( static_cast < VirtualNetwork * > ( vn ) ) ;
2016-04-06 19:07:56 +03:00
return PoolSQL : : drop ( vn , error_msg ) ;
} ;
2008-11-13 19:21:17 +03: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
*/
2018-03-18 01:31:52 +03:00
VirtualNetwork * get ( int oid )
2008-11-13 19:21:17 +03:00
{
2018-03-18 01:31:52 +03:00
return static_cast < VirtualNetwork * > ( PoolSQL : : get ( oid ) ) ;
2008-11-13 19:21:17 +03:00
} ;
2010-04-06 01:34:09 +04:00
2018-10-09 12:05:08 +03:00
/**
* Function to get a read only 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
*/
VirtualNetwork * get_ro ( int oid )
{
return static_cast < VirtualNetwork * > ( PoolSQL : : get_ro ( oid ) ) ;
} ;
2011-07-12 21:30:00 +04: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
*/
2018-03-18 01:31:52 +03:00
VirtualNetwork * get ( const string & name , int uid )
2011-07-12 21:30:00 +04:00
{
2018-03-18 01:31:52 +03:00
return static_cast < VirtualNetwork * > ( PoolSQL : : get ( name , uid ) ) ;
2011-07-12 21:30:00 +04:00
} ;
2018-10-09 12:05:08 +03:00
/**
* Gets a read only 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_ro ( const string & name , int uid )
{
return static_cast < VirtualNetwork * > ( PoolSQL : : get_ro ( name , uid ) ) ;
} ;
2008-11-13 19:21:17 +03:00
/**
* Bootstraps the database table ( s ) associated to the VirtualNetwork pool
2011-10-10 17:14:46 +04:00
* @ return 0 on success
2008-11-13 19:21:17 +03:00
*/
2011-10-10 17:14:46 +04:00
static int bootstrap ( SqlDB * _db )
2008-11-13 19:21:17 +03:00
{
2016-04-06 19:07:56 +03:00
ostringstream oss ;
int rc ;
rc = VirtualNetwork : : bootstrap ( _db ) ;
2017-04-21 20:16:45 +03:00
rc + = _db - > exec_local_wr ( BitMap < 0 > : : bootstrap ( vlan_table , oss ) ) ;
2016-04-06 19:07:56 +03:00
return rc ;
2008-11-13 19:21:17 +03:00
} ;
2010-04-06 01:34:09 +04:00
2008-11-13 19:21:17 +03:00
/**
2010-04-11 00:15:47 +04:00
* Dumps the Virtual Network pool in XML format . A filter can be also added
* to the query
2009-07-09 18:34:34 +04:00
* @ param oss the output stream to dump the pool contents
* @ param where filter for the objects , defaults to all
2014-01-13 19:30:43 +04:00
* @ param limit parameters used for pagination
2018-07-24 12:41:41 +03:00
* @ param desc descending order of pool elements
2009-07-09 18:34:34 +04:00
*
* @ return 0 on success
2008-11-13 19:21:17 +03:00
*/
2018-10-09 12:05:08 +03:00
int dump ( string & oss , const string & where , const string & limit ,
2018-07-24 12:41:41 +03:00
bool desc )
2011-03-09 15:23:01 +03:00
{
2018-10-09 12:05:08 +03:00
return PoolSQL : : dump ( oss , " VNET_POOL " , " body " , VirtualNetwork : : table , where ,
2018-07-24 12:41:41 +03:00
limit , desc ) ;
2011-03-09 15:23:01 +03:00
}
2009-07-09 18:34:34 +04:00
2010-07-01 21:04:52 +04: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 12:34:18 +04: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 19:07:56 +03: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 03:35:33 +03:00
VirtualMachineNic * nic ,
2016-04-06 19:07:56 +03: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
2018-05-31 17:41:41 +03:00
* @ param check_lock for check if the resource is lock or not
* @ param uid of user making the request
* @ param sgs to check the security groups
2016-04-06 19:07:56 +03:00
*/
void authorize_nic (
PoolObjectSQL : : ObjectType ot ,
2016-12-24 03:35:33 +03:00
VirtualMachineNic * nic ,
2016-04-06 19:07:56 +03:00
int uid ,
2018-04-27 17:31:12 +03:00
AuthRequest * ar ,
2018-05-31 13:50:02 +03:00
set < int > & sgs ,
bool check_lock ) ;
2016-06-03 20:16:51 +03: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 18:50:45 +03:00
* @ param ip / mac the first ip / mac in the reservations
2016-06-03 20:16:51 +03: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 18:50:45 +03: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 20:16:51 +03: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 18:50:45 +03:00
2009-07-09 18:34:34 +04:00
private :
2008-11-13 19:21:17 +03:00
/**
* Holds the system - wide MAC prefix
*/
2016-04-06 19:07:56 +03:00
static unsigned int _mac_prefix ;
2010-04-06 01:34:09 +04:00
2008-11-13 19:21:17 +03:00
/**
* Default size for Virtual Networks
*/
2016-04-06 19:07:56 +03:00
static unsigned int _default_size ;
2010-04-06 01:34:09 +04:00
2013-11-14 14:49:53 +04:00
/**
* VNet attributes to be injected into the VM nic
*/
vector < string > inherit_attrs ;
2009-07-09 18:34:34 +04:00
/**
2016-04-06 19:07:56 +03:00
* Configuration attributes for the vlan_id pool
2009-07-09 18:34:34 +04:00
*/
2016-04-06 19:07:56 +03:00
const VectorAttribute vlan_conf ;
2011-11-13 02:39:10 +04:00
2016-04-06 19:07:56 +03:00
/**
* 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-13 02:39:10 +04:00
/**
2012-10-08 14:33:32 +04:00
* Function to get a VirtualNetwork by its name , as provided by a VM
2011-11-13 02:39:10 +04:00
* template
*/
2016-12-24 03:35:33 +03:00
VirtualNetwork * get_nic_by_name ( VirtualMachineNic * nic ,
2011-11-13 02:39:10 +04:00
const string & name ,
2012-02-25 00:13:56 +04:00
int _uidi ,
2018-10-09 12:05:08 +03:00
bool ro ,
2012-02-25 00:13:56 +04:00
string & error ) ;
2011-11-13 02:39:10 +04:00
/**
* Function to get a VirtualNetwork by its id , as provided by a VM template
*/
2018-10-09 12:05:08 +03:00
VirtualNetwork * get_nic_by_id ( const string & id_s , bool ro , string & error ) ;
2016-04-06 19:07:56 +03:00
//--------------------------------------------------------------------------
// VLAN ID management functions
//--------------------------------------------------------------------------
/**
* Gets a free VLAN_ID , if not set by the user , and for VXLAN , VLAN and
2016-04-19 16:20:45 +03:00
* OVSWITCH networks .
2016-04-06 19:07:56 +03:00
* @ param vn pointer to the network
* @ return 0 on success
*/
int set_vlan_id ( VirtualNetwork * vn ) ;
2018-10-08 19:10:10 +03:00
/**
* Helper functions to compute the next vlan_id for 802.1 Q 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 ) ;
2016-04-06 19:07:56 +03:00
/**
* Free a previously allocated VLAN ID if needed
* @ param vn pointer to the network
*/
void release_vlan_id ( VirtualNetwork * vn ) ;
2016-06-03 20:16:51 +03: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 19:07:56 +03: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 19:21:17 +03:00
} ;
2010-04-06 01:34:09 +04:00
2010-06-07 19:51:46 +04:00
# endif /*VIRTUAL_NETWORK_POOL_H_*/