2008-11-13 19:21:17 +03:00
/* -------------------------------------------------------------------------- */
2022-04-07 20:49:58 +03:00
/* Copyright 2002-2022, 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"
2020-06-29 13:14:00 +03:00
# include "OneDB.h"
2008-11-13 19:21:17 +03:00
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
/**
* The Virtual Network Pool class . . . .
*/
class VirtualNetworkPool : public PoolSQL
{
public :
2016-04-07 12:06:43 +03:00
VirtualNetworkPool ( SqlDB * db ,
2020-07-02 23:42:10 +03:00
const std : : string & str_mac_prefix ,
2021-06-24 11:52:46 +03:00
unsigned long int default_size ,
2020-07-02 23:42:10 +03:00
std : : vector < const SingleAttribute * > & restricted_attrs ,
std : : vector < const SingleAttribute * > & encrypted_attrs ,
const std : : vector < const SingleAttribute * > & _inherit_attrs ,
2016-04-07 12:06:43 +03:00
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 ,
2020-07-02 23:42:10 +03:00
const std : : string & uname ,
const std : : string & gname ,
2013-01-18 21:34:51 +04:00
int umask ,
2014-05-30 20:59:25 +04:00
int parent_vid ,
2020-09-15 12:16:00 +03:00
std : : unique_ptr < VirtualNetworkTemplate > vn_template ,
2011-05-12 19:10:35 +04:00
int * oid ,
2020-07-02 23:42:10 +03:00
const std : : set < int > & cluster_ids ,
std : : string & error_str ) ;
2008-11-13 19:21:17 +03:00
2022-04-09 15:48:15 +03:00
/**
* Updates a Virtual Network in the data base . It also updates the previous state
* after executing the hooks .
* @ param objsql a pointer to the Host
*
* @ return 0 on success .
*/
int update ( PoolObjectSQL * objsql ) override ;
2016-04-06 19:07:56 +03:00
/**
* Drops a Virtual Network and the associated VLAN_ID if needed
*/
2020-07-02 23:42:10 +03:00
int drop ( PoolObjectSQL * vn , std : : 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
/**
2020-09-10 10:08:29 +03:00
* Gets an object from the pool ( if needed the object is loaded from the
* database ) . The object is locked , other threads can ' t access the same
* object . The lock is released by destructor .
* @ param oid the VN unique identifier
* @ return a pointer to the VN , nullptr in case of failure
2008-11-13 19:21:17 +03:00
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get ( int oid )
2008-11-13 19:21:17 +03:00
{
2020-09-10 10:08:29 +03:00
return PoolSQL : : get < VirtualNetwork > ( oid ) ;
}
2010-04-06 01:34:09 +04:00
2018-10-09 12:05:08 +03:00
/**
2020-09-10 10:08:29 +03:00
* Gets a read only object from the pool ( if needed the object is loaded from the
* database ) . No object lock , other threads may work with the same object .
* @ param oid the VN unique identifier
* @ return a pointer to the VN , nullptr in case of failure
2018-10-09 12:05:08 +03:00
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get_ro ( int oid )
2018-10-09 12:05:08 +03:00
{
2020-09-10 10:08:29 +03:00
return PoolSQL : : get_ro < VirtualNetwork > ( oid ) ;
}
2018-10-09 12:05:08 +03:00
2011-07-12 21:30:00 +04:00
/**
* Gets an object from the pool ( if needed the object is loaded from the
2020-09-10 10:08:29 +03:00
* database ) . The object is locked , other threads can ' t access the same
* object . The lock is released by destructor .
2011-07-12 21:30:00 +04:00
* @ param name of the object
* @ param uid id of owner
*
* @ return a pointer to the object , 0 in case of failure
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get ( const std : : string & name , int uid )
2011-07-12 21:30:00 +04:00
{
2020-09-10 10:08:29 +03:00
return PoolSQL : : get < VirtualNetwork > ( 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
2020-09-10 10:08:29 +03:00
* database ) . No object lock , other threads may work with the same object .
2018-10-09 12:05:08 +03:00
* @ param name of the object
* @ param uid id of owner
*
* @ return a pointer to the object , 0 in case of failure
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get_ro ( const std : : string & name , int uid )
2018-10-09 12:05:08 +03:00
{
2020-09-10 10:08:29 +03:00
return PoolSQL : : get_ro < VirtualNetwork > ( name , uid ) ;
}
2018-10-09 12:05:08 +03:00
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
{
2020-07-02 23:42:10 +03:00
std : : ostringstream oss ;
2016-04-06 19:07:56 +03:00
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
2020-04-13 18:32:21 +03:00
* @ param sid first element used for pagination
* @ param eid last element used for pagination , - 1 to disable
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
*/
2020-04-13 18:32:21 +03:00
int dump ( std : : string & oss , const std : : string & where , int sid , int eid ,
bool desc )
2011-03-09 15:23:01 +03:00
{
2020-06-29 13:14:00 +03:00
return PoolSQL : : dump ( oss , " VNET_POOL " , " body " , one_db : : vn_table ,
2020-04-13 18:32:21 +03:00
where , sid , eid , 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
*/
2021-06-24 11:52:46 +03:00
static const unsigned long int & default_size ( )
2010-07-01 21:04:52 +04:00
{
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
*/
2020-07-02 23:42:10 +03:00
int search ( std : : vector < int > & oids , const std : : string & where )
2014-09-11 12:34:18 +04:00
{
2020-06-29 13:14:00 +03:00
return PoolSQL : : search ( oids , one_db : : vn_table , where ) ;
2014-09-11 12:34:18 +04:00
} ;
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 ,
2020-07-02 23:42:10 +03:00
std : : string & error_str ) ;
2016-04-06 19:07:56 +03:00
/**
* 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 ,
2020-07-02 23:42:10 +03:00
std : : 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
*/
2020-07-02 23:42:10 +03:00
int reserve_addr ( int pid , int rid , unsigned int rsize , std : : string & err ) ;
2016-06-03 20:16:51 +03:00
/**
* 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 ,
2020-07-02 23:42:10 +03:00
std : : string & err ) ;
2016-06-03 20:16:51 +03:00
/**
* 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 ,
2020-07-02 23:42:10 +03:00
unsigned int ar_id , const std : : string & ip , std : : string & err ) ;
2017-02-21 18:50:45 +03:00
int reserve_addr_by_ip6 ( int pid , int rid , unsigned int rsize ,
2020-07-02 23:42:10 +03:00
unsigned int ar_id , const std : : string & ip , std : : string & err ) ;
2017-02-21 18:50:45 +03:00
2016-06-03 20:16:51 +03:00
int reserve_addr_by_mac ( int pid , int rid , unsigned int rsize ,
2020-07-02 23:42:10 +03:00
unsigned int ar_id , const std : : string & mac , std : : string & err ) ;
2017-02-21 18:50:45 +03:00
2022-04-09 15:48:15 +03:00
void delete_success ( std : : unique_ptr < VirtualNetwork > vn ) ;
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
*/
2021-06-24 11:52:46 +03:00
static unsigned long 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
*/
2020-07-02 23:42:10 +03:00
std : : vector < std : : string > inherit_attrs ;
2013-11-14 14:49:53 +04:00
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
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get_nic_by_name ( VirtualMachineNic * nic ,
const std : : string & name ,
int _uidi ,
bool ro ,
std : : string & error ) ;
2011-11-13 02:39:10 +04:00
/**
* Function to get a VirtualNetwork by its id , as provided by a VM template
*/
2020-09-10 10:08:29 +03:00
std : : unique_ptr < VirtualNetwork > get_nic_by_id ( const std : : string & id_s ,
bool ro ,
std : : 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
*/
2020-07-02 23:42:10 +03:00
int set_8021Q_id ( int vnid , std : : string & vlan_var , bool & auto_var ) ;
2018-10-08 19:10:10 +03:00
2020-07-02 23:42:10 +03:00
int set_vxlan_id ( int vnid , std : : string & vlan_var , bool & auto_var ) ;
2018-10-08 19:10:10 +03:00
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
*/
2020-07-02 23:42:10 +03:00
AddressRange * allocate_ar ( int rid , std : : string & err ) ;
2016-06-03 20:16:51 +03:00
/**
* 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
*/
2020-07-02 23:42:10 +03:00
int add_ar ( int rid , AddressRange * rar , std : : string & err ) ;
2016-06-03 20:16:51 +03:00
2016-04-06 19:07:56 +03:00
/**
* Factory method to produce VN objects
* @ return a pointer to the new VN
*/
PoolObjectSQL * create ( )
{
2020-07-02 23:42:10 +03:00
std : : set < int > empty ;
2016-04-06 19:07:56 +03:00
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_*/